我在C++中有以下程序。目标是接收一些日志(来自filedata变量),解析日志,并将它们保存到对象列表中。在C++列表中插入对象
解析其工作良好的部分。但是,当我迭代解析的矢量并尝试将一些元素保存到列表中时,我遇到了问题。我可以获取元素(例如:elements.at(0)
我得到第一列(时间戳),但是当我保存到我的列表中时,我们保存了两次日志(在这种情况下,filedata
只有两个日志),但是我们节省了两次相同的日志
我CPP项目:
#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;
}
输出(当遍历列表):
9999999999
000002D9
user2
2800
9999999999
000002D9
user2
2800
预期输出:
1496843100
000002D8
user1
2600
9999999999
000002D9
user2
2800
我的程序保存两个日志(这部分是“好”,我只有两个日志),但其保存始终是相同的(奇怪的是最后的日志)
我已经编辑帖子,并把正确的代码。谢谢 – rrpik93
你调试过吗?问问你自己:*你在推荐什么?*这是一个*指针列表*。 *相同*指针被重复推入列表中。这里没有明确的记录。只有一个*。 – WhozCraig
我相信,一个好的调试器会发现问题。提示:看看你的对象'userLogRecord'。 – Rene