为什么我的程序从 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;
}
}
我有一个名为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;
}
}