Ich habe das folgende Programm in C++. Das Ziel ist, einige Protokolle zu erhalten (die von der filedata-Variable stammen), die Protokolle zu analysieren und sie in der Objektliste zu speichern.Einfügen Objekt in C++ Liste
Der Teil, der das parse funktioniert gut. Aber ich habe ein Problem, wenn ich den geparsten Vektor iteriere und versuche, einige Elemente in der Liste zu speichern. Ich kann die Elemente erhalten (zum Beispiel: elements.at(0)
Ich bekomme die erste Spalte (Zeitstempel) aber wenn ich auf meiner Liste speichern, speichern wir zweimal das Protokoll (in diesem Fall die filedata
haben nur zwei Protokolle), aber wir speichern zwei Mal die SAME log
Mein cpp Programm.
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <iterator>
#include <list>
class UserLogRecord
{
public:
std::string timestamp;
std::string id;
std::string name;
std::string data;
};
std::vector<std::string> explode(std::string const & s, char delim)
{
std::vector<std::string> result;
std::istringstream iss(s); // sequence of characters
for (std::string token; std::getline(iss, token, delim);)
{
result.push_back(std::move(token)); //transfer token to vector
}
return result;
}
int main()
{
const char* filedata =
"1496843100;2017-06-07 13:45:00;000002D8;2600;user1\n"
"9999999999;2017-06-07 13:45:00;000002D9;2800;user2";
std::vector<std::string> lines = explode(filedata,'\n');
std::list<UserLogRecord* > userLogRecords;
UserLogRecord* userLogRecord = new UserLogRecord;
//vector
for(int i = 0; i < lines.size(); i++)
{
std::vector<std::string> elements = explode(lines[i], ';');
userLogRecord->timestamp = elements.at(0);
userLogRecord->id = elements.at(2);
userLogRecord->name = elements.at(4);
userLogRecord->data = elements.at(3);
userLogRecords.push_back(userLogRecord);
}
//list of logs
std::list<UserLogRecord* >::const_iterator itLog = userLogRecords.begin();
while (itLog != userLogRecords.end())
{
std::cout << '\n' + (*itLog)->timestamp + '\n';
std::cout << (*itLog)->id + '\n';
std::cout << (*itLog)->name + '\n';
std::cout << (*itLog)->data + '\n';
++itLog;
}
return 0;
}
Ausgang (wenn die Liste iterieren):
9999999999
000002D9
user2
2800
9999999999
000002D9
user2
2800
Erwartete Ausgabe:
1496843100
000002D8
user1
2600
9999999999
000002D9
user2
2800
Mein Programm speichert zwei Protokolle (dieser Teil ist ‚gut‘, ich habe nur zwei Protokolle), aber es ist immer das gleiche speichern (merkwürdig ist es das letzte Protokoll)
Ich bearbeite bereits den Beitrag und den richtigen Code. Danke – rrpik93
Haben Sie das debuggen? Fragen Sie sich selbst: * Was drängen Sie in Ihre Liste? * Es ist eine Liste von * Zeigern *. Der * gleiche * Zeiger wird wiederholt in die Liste geschoben. Es gibt keine eindeutigen Aufzeichnungen hier. Es gibt nur eins*. – WhozCraig
Ich bin sicher, mit einem guten Debugger wirst du das Problem finden. Tipp: Sehen Sie sich Ihr Objekt 'userLogRecord' an. – Rene