从文件C ++中读取数据

时间:2016-01-27 19:34:45

标签: c++

我在.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.252016-01-18

3 个答案:

答案 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}}行。它有效,它给了我想要的结果。