c++ - 我无法在使用 fstream 读取文件后立即写入文件

标签 c++ io fstream

<分区>

据我了解,fstream 允许您写入和读取同一个打开的文件。 它还具有两个“文件指针”,一个用于读取,另一个用于写入。 但是,如果我先从文件中读取一行,然后尝试在其中写入 - 文件不会更改,即使我在之后使用 flush()

有一种方法可以解决此问题 - 使用 seekp() 并将“文件指针”移动到某处。 但我不明白为什么它会那样工作。 还有一些奇怪的细节——如果我在写入前后使用 tellp() 检查文件指针——它们实际上改变了它们的位置! 也许我在某些地方弄错了,如果有任何帮助,我将不胜感激

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main() {
    fstream file("Output.txt");
    string line = "";

    getline(file, line);
    cout << "Read line: " << line << endl;

    cout << "tellg: " << file.tellg() << endl;
    cout << "tellp: " << file.tellp() << endl;
    cout << "rdstate: " << file.rdstate() << endl;
    cout << "------------------------------- " << endl;

    file.write("test", 4);
    file.flush();
    cout << "After writing:\nrdstate: " << file.rdstate() << endl;
    cout << "tellg: " << file.tellg() << endl;
    cout << "tellp: " << file.tellp() << endl;

    file.close();
    cout << "------------------------------- " << endl;
    cout << "After closing:\nrdstate: " << file.rdstate() << endl;
}

所以我有一个文件:

a
b
c
d

程序运行后不会改变。根据 rdstate()

没有任何错误

程序输出:

Read line: a
tellg: 3
tellp: 3
rdstate: 0

After writing:
rdstate: 0
tellg: 9
tellp: 9

After closing:
rdstate: 0

最佳答案

在我看来,问题出在 Visual Studio 编译器中(我使用的是 2019 版本,但@Scheff 可以在 VS2013 中重现这种错误)。

所以解决方案是在读取之后的写入之前插入一个 file.seekp(file.tellp()) ,反之亦然。 或者你可以只使用另一个编译器:-)

关于c++ - 我无法在使用 fstream 读取文件后立即写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55889533/

相关文章:

C++ 在另一个函数中调用一个类函数

c++ - 点未声明

java - 将文件中的数据加载到二维数组中

java - 如何将十六进制文件转换为二进制数组 Android,Java

c++ - 删除元素后列表的最后一个元素损坏

c++ - std::string 中的堆损坏?

c++ - 如何在 beginNativePainting() 中翻转纹理?

linux - 输入一串字符并输出为大写

c++ - 有没有办法创建一个公共(public)输出流对象以在控制台上打印并打印到 C++ 中的文件?

c++ - 从文件写入类型类的 vector