如何在C++中使用`fstream`同时写入和读取文件?

4
我正在尝试使用一个fstream对象将文本写入文件,然后再读取它。
我的问题与this question非常相似,但是读/写的顺序不同。他先尝试读取再写入,而我先尝试写入再读取。他的代码能够读取但无法写入,而我的代码能够写入但无法读取。
我已经尝试过他的解决方案,但它只适用于读写操作,而不是写入-读取操作。
以下是我的代码:
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    fstream fileObj("file.txt", ios::out|ios::in|ios::app);

    // write
    fileObj << "some text" << endl;

    // read
    string line;
    while (getline(fileObj, line))
        cout << line << endl;
}

代码成功地将“some text”写入“file.txt”,但没有从文件中输出任何文本。但是,如果我不写入文件(删除fileObj << "some text" << endl;),代码将输出文件的所有文本。如何先写入再读取文件?
2个回答

7
这是因为在写操作后,您的文件流对象已经到达文件末尾。当您使用getline(fileObj, line)读取一行时,您已经到达了文件末尾,因此您没有读取任何内容。
在开始读取文件之前,您可以使用fileObj.seekg(0, ios::beg)将文件流对象移动到文件开头,这样您的读取操作将正常工作。
int main()
{
    fstream fileObj("file.txt", ios::out | ios::in | ios::app);

    // write
    fileObj << "some text" << endl;

    // Move stream object to beginning of the file
    fileObj.seekg(0, ios::beg);

    // read
    string line;
    while (getline(fileObj, line))
        cout << line << endl;

}

尽管这个答案不符合您“同时读写文件”的要求,但请记住在写入时,该文件很可能会被锁定。

1
@john 谢谢你的建议。我已经更新了我的答案。 - Saket Sharad

-1

这里是一个简单的例子,用于编写和读取文件。 希望能对你有所帮助。

  #include<fstream>
    using namespace std;
    int main ()
    {

        ofstream fout ("text.txt"); //write
        ifstream fin ("text.txt"); // read

        fout<<"some text";
        string line;
        while (fin>> line) {
            cout<<line;
        }

        return 0;
    }

有效的解决方法。但不确定它是否完全达到了原帖作者的意图。 - user10957435
4
这个看起来不正确。你想读取的文件仍然处于打开状态,因此不能进行读取操作。我编写了这段代码,但无法使其工作。需要添加的一件事是在开始阅读之前关闭文件。 - Saket Sharad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接