1

我创建了一个名为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怎么了\n酷”。

当然,我没有在我的文本文件中准确地写 \n。但正如你所看到的,最后没有新行。

我的问题是,每当我将“内容”打印到屏幕上时,最后都会有一个新行。但我删除了最后一个新行......怎么了?

4

2 回答 2

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';
}

It's incredible how many people think that eof can predict whether the next read will have an eof problem. But it doesn't, it tells you that the last read had an eof problem. It's been like this throughout the entire history of C and C++ but it's obviously counter-intuitive because many, many people make this mistake.

于 2013-03-29T21:17:40.253 回答
4

eof直到您尝试读取文件末尾之后才会设置。您的循环为三行迭代四次;但是,最后一次迭代没有读取任何数据。

更正确的方法是将您的 while 循环更改为while (std::getline(file, temp)); 这将在第三次读取后到达文件末尾时终止循环。

于 2013-03-29T21:17:31.033 回答