字符串的'\ n'太多了

时间:2013-03-29 21:13:29

标签: c++

我创建了一个名为 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。但正如你所看到的那样,最后没有新的界限。

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

2 个答案:

答案 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));这将在第三次读取后到达文件末尾时终止循环。