我在.txt
日志文件中有这些数据集:
2016-01-17 Red 1 2 2.252016-01-18 blue 3 1 1.34
我将它存储到vector中,代码如下所示:
while(!logFile.eof()) {
getline(logFile, l.date, ' ');
getline(logFile, l.color, ' ');
logFile >> l.minUsage;
logFile >> l.maxUsage;
logFile >> l.ratio;
logFile.ignore(1000, ' ');
log.push_back(l);
}
log的数据类型为vector<Record>
,其中Record
是一个类。当我打印它时,我希望值看起来像这样:
2016-01-17 Red 1 2 2.25
2016-01-18 blue 3 1 1.34
但我得到了这个输出:
2016-01-17 Red 1 2 2.25
blue 3 1 0 1.34
第二行不存储来自.txt
文件的第二组数据的日期值。
如何将2.252016-01-18
与.txt
文件分隔为2个不同的条目,例如2.25
和2016-01-18
?
答案 0 :(得分:2)
切勿使用!logFile.eof()
来测试输入结束时输入结束时不返回true
的输入结束。请改用getline
,例如:
while ((getline(logFile, l.date, ' ') && (getline(logFile, l.color, ' ')) {
// ...
答案 1 :(得分:2)
您可以构建一个简单的状态机并按空格分隔的字符串提取:
enum Group { DATE_ALONE, COLOR, NUM1, NUM2, NUM3_AND_DATE };
Group state = Group::DATE_ALONE;
std::string str{};
while (logFile >> str) {
switch (state) {
case Group::DATE_ALONE:
auto date = makeDateFromString(str);
doSomethingWith(date);
state = Group::COLOR;
break;
case Group::COLOR:
auto color = makeColorFromString(str);
doSomethingWith(color);
state = Group::NUM1;
break;
// etc...
case Group::NUM3_AND_DATE:
auto num = makeNumFromString(str.substr(0, 4));
doSomethingWith(num);
auto date = makeDateFromString(str.substr(4));
doSomethingWith(date);
state = Group::COLOR; // Skip the `DATE_ALONE` state
break;
}
}
答案 2 :(得分:1)
解决。由于日志文件中ratio
的值都是3位小数,所以我将ratio
的类型更改为只接受4个字符(例如:2.13
),然后我删除了{ {1}}行。它有效,它给了我想要的结果。