我创建了一个名为 FileReader 的类。这是我在这个班级的阅读功能。它打开一个文件并读取它。当然,它将文件的内容放在我的类的“内容”变量中。它在最后一行。
std::string file_content;
std::string temp;
std::ifstream file;
file.open(filepath,std::ios_base::in);
while(!file.eof()){
temp.clear();
getline(file, temp);
file_content += temp;
file_content += '\n';
}
file_content = file_content.substr(0, file_content.length()-1); //Removes the last new line
file.close();
content = file_content;
我正在打开的文件包含以下内容:
“你好\ n什么了?\ nCool”。
当然我没有在我的文本文件中完全写出\ n。但正如你所看到的那样,最后没有新的界限。
我的问题是,每当我将它打印到屏幕上时,“内容”都会在最后添加一个新行。但我删除了最后一个新行...出了什么问题?
答案 0 :(得分:5)
经典错误,在您阅读之前使用eof
而不是之后。这是正确的
while (getline(file, temp))
{
file_content += temp;
file_content += '\n';
}
或者如果您必须使用eof
,请务必在 getline
之后使用。
for (;;)
{
getline(file, temp);
if (file.eof()) // eof after getline
break;
file_content += temp;
file_content += '\n';
}
令人难以置信的是,有多少人认为eof
可以预测下一次阅读是否会出现问题。但它没有,它告诉你最后一次阅读有一个eof问题。在C和C ++的整个历史中它都是这样的,但它显然是反直觉的,因为很多人犯了这个错误。
答案 1 :(得分:4)
eof
才会设置。你的循环迭代四次三行;但是,最后一次迭代不会读取任何数据。
更正确的方法是将while循环更改为while (std::getline(file, temp))
;这将在第三次读取后到达文件末尾时终止循环。