为什么我的程序从 C++ 文件中读取一个额外的条目?

Why is my program reading an extra entry from a file in C++?

我有一个名为1.txt的文件,它包含3行,每行存储在class entry的一个对象中,如下所示:

1* 10/12/2020 5:30 a 11:15 p 0 0 0 0 -----
2* 11/12/2020 3:45 a 5:46 a 0 0 0 0 -----
3* 12/12/2020 5:46 a 4:56 p 34.6 0 0 0 blah

我正在逐行从该文件读取到 Entry e,并将每个条目存储到 std::vector<Enrty>records,如下所示:

void read_records(std::ifstream file, Entry e, std::vector<Entry>&records)
{
    std::string line;
        std::cout << "READING TEXT FILE CONTENTS..." << std::endl;
        while (file)
        {
            getline(file, line);
            e.read_text(tokenize(line)); // tokenize tokenizes line to tokens and e.read_text stores data from that line into e
            records.push_back(e);
            e.reset(); // this resets e back to original state
        }
}

当我在调用此函数后显示 records 时,它会给我一个额外的记录条目,如下所示, std::<Entry>records中的内容是:

1* 10/12/2020 5:30 a 11:15 p 0 0 0 0 -----
2* 11/12/2020 3:45 a 5:46 a 0 0 0 0 -----
3* 12/12/2020 5:46 a 4:56 p 34.6 0 0 0 blah
3* 12/12/2020 5:46 a 4:56 p 34.6 0 0 0 blah   // I'm getting this extra entry in records when the file only contains 3 entries.

请解释为什么会这样,现在用 visual studio C++ 解决这个问题。

我认为这里的问题可能源于 while 声明 - 这将根据您的预期添加额外的迭代,因为此条件仅在您已经超过文件末尾后为假。

while(file) {
// ...
}

getline 一次读取整行,并且由于 EOF 不是一行,因此可以避免不必要的额外迭代。 这是在此用例中摄取文件流的正确方法:

#include <iostream>
#include <sstream>
#include <string>
#include <fstream>
#include <vector>

int main() {
  std::vector<std::string> records;
  std::ifstream infile("thefile.txt");
  std::string line;
  while (std::getline(infile, line)) {
    records.push_back(line);
  }
  for (std::string e : records) {
    std::cout << e << std::endl;
  }
}