我正在尝试使用相同的fstream对象首先写入文件,然后再读取文件。
当我使用下面的代码时,写文件的代码可以正常工作,但是我得到的是垃圾输出,而不是写在文件中的文本。
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main() {
fstream file;
file.open("test.txt",ios::in|ios::out| ios::trunc);
if (!file) {
cout << "Error";
}
else {
cout << "success";
file <<"\n\n1st Line\n 2nd line \n 3rd line\n";
string filecontent;
while (file.good()) {
getline(file, filecontent);
cout << filecontent << endl;
}
}
return 0;
}
Output
最佳答案
此代码有两个单独的问题。第一个(其他人至少已经在某种程度上指出了这一点)是您的循环未正确检测到文件结尾。实际上,几乎在任何时候使用while (!file.eof())
或while (file.good())
都将是一个错误-它不会在正确的时间检测到文件结尾,因此(例如)在到达文件结尾时,您会t在正确的时间检测到它,您将看到文件的最后一项似乎在循环退出之前被读取了两次。
但是,除此之外,您还有一个问题,即将写入文件,然后立即尝试读取。根本不允许这样做-您想在读和写之间切换时随时进行查找。
在这种情况下,您还有其他问题。由于您只是将数据写入文件中,因此文件的当前位置在文件的末尾。因此,即使您可以不经搜索就开始阅读,也可以从文件末尾开始阅读。当然,那将立即失败。
因此,您还确实需要回溯到文件的开头才能读回文件。
因此,此处的重大更改是在完成写入之后但在开始尝试重新读取数据之前,添加一行:file.seekg(0);
,然后将读取循环更改为:
while (getline(file, filecontent)) {
cout << filecontent << endl;
}
最后一点:尽管在这种情况下不会有很大的不同,但我建议使用"\n"
而不是std::endl
。 std::endl
写入换行符并刷新文件缓冲区。当您写到屏幕上时,它并没有什么真正的区别,但是当写一个普通文件时,不必要地刷新缓冲区可以并且会大大减慢您的代码的速度(通常慢10倍)。
关于c++ - 无法在C++中使用相同的fstream对象进行读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64580487/