c++ - 使用 std::fstream 从文件读取和追加文件

标签 c++ file stream std

我想知道为什么下面这段代码不起作用,看起来很简单,我是不是搞错了?
这样做的结果是:文件已创建但为空,如果我手动添加行,这些行将与此代码一起显示,但不会发生其他任何事情。

#include <fstream>
#include <iostream>
#include <string>
using namespace std;

int main(){
    fstream mfile("text.txt", ios_base::in | ios_base::out | ios_base::app);

    mfile.seekg(ios_base::beg);
    string line;
    while( getline(mfile,line) ){
        std::cout << line << "\n";
    }
    mfile.seekg(ios_base::end);

    mfile << "Line 1\n";
    mfile << "Line 2\n";
    mfile << "---------------------------------\n";

    mfile.seekg(ios_base::beg);
    while( getline(mfile,line) ){
        std::cout << line << "\n";
    }
    mfile.seekg(ios_base::end);

}

最佳答案

一些事情:

当你准备写的时候,你需要seekp()而不是seekg(),即

mfile.seekp(ios_base::end);

现在,这里的问题是 getline() 调用将设置流标志(特别是 eof),因此流还没有准备好进行进一步的操作,您需要清除先插旗!

试试这个:

string line;
mfile.seekg(ios_base::beg);
while( getline(mfile,line) ){
    std::cout << line  << endl;
}
mfile.seekp(ios_base::end); // seekp
mfile.clear(); // clear any flags

mfile << "Line 1" << endl; // now we're good
mfile << "Line 2" << endl;
mfile << "---------------------------------" << endl;

mfile.seekg(ios_base::beg);
while( getline(mfile,line) ){
    std::cout << line <<  endl;
}

此外,使用 std::endl 而不是“\n”,这将在操作系统方便时触发将缓冲区刷新到文件...

关于c++ - 使用 std::fstream 从文件读取和追加文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4100880/

相关文章:

java - 将带有图像的 Python 请求转换为 cURL

file - 什么是基本文件操作的良好脚本语言?

node.js - 如何在以多部分形式处理文件流之前等待字段

nginx - 在Nginx中以低客户端带宽流式传输Mjpeg

c++ - 如何从 C++ 中的网络摄像头读取输入?

c++ - notify_all 不唤醒等待线程

c++ - 迭代、插入和删除?

检查文件是否正在使用 Win32 API 或 C/C++ 写入。我自己没有写权限

c++ - random_shuffle 不是真正随机的

c++ - 编译结果报错 "undefined symbols for architecture i386"