c++ - 无法在C++中使用相同的fstream对象进行读写

标签 c++

我正在尝试使用相同的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::endlstd::endl写入换行符并刷新文件缓冲区。当您写到屏幕上时,它并没有什么真正的区别,但是当写一个普通文件时,不必要地刷新缓冲区可以并且会大大减慢您的代码的速度(通常慢10倍)。

关于c++ - 无法在C++中使用相同的fstream对象进行读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64580487/

相关文章:

c++ - 规避 C++ 空终止字符串的挫败感

c++ - 当存在具有默认参数的构造函数时,c++构造函数中的歧义

c++ - 如何在 Turbo C++ 文件夹中安装或包含 opengl 库 GLUT 以运行 opengl 程序

c++ - 从路径返回文件名

c++ - 创建一个非预定义大小的数组?

c++ - 模板继承(在子类成员函数中访问父类的变量和对象)

c++ - 为什么函数不知道数组大小?

c++ - 如何将绑定(bind)与通过引用传递的抽象类结合使用

C++ vector 不保留从循环接收的值

C++:指针和圆括号 - 这是什么意思?