可以插入 fstream,但不能插入 iostream

Can insert in an fstream, but not in an iostream

提问人:Pietro 提问时间:8/31/2016 更新时间:8/31/2016 访问量:88

问:

尝试在文件中间插入一个字符串,从文件的末尾开始。

以下代码适用于 fstream,但不适用于 iostream(在本例中,输出字符串等于输入字符串):

    // File contents: "abcdefghijklmnopqrstxyz"; "uvw" missing

    // 1 - OK
    //fstream  iofs(fPath, ios_base::in | ios_base::out);

    // 2 - Same output
    filebuf   fileBuffer;
    iostream  iofs(&fileBuffer);    // generic output stream
    fileBuffer.open(fPath.c_str(), ios_base::in | ios_base::out | ofstream::app);
    iofs.rdbuf(&fileBuffer);

    iofs.seekg(0, ios_base::end);
    iofs.seekp(0, ios_base::end);

    for(int i = 1; i < 20; ++i)
    {
        iofs.seekg(-i, std::ios_base::end);

        char c = char(iofs.peek());

        if(c == 't') {
            iofs.seekp(-i + 1, std::ios_base::end);
            iofs << "uvw";      // add missing token
            iofs << "xyz";      // append pre-existing token
            break;
        }
    }

输出:案例 1:
开始 = abcdefghijklmnopqrstxyz;结果 = abcdefghijklmnopqrstuvwxyz 案例 2:开始 = abcdefghijklmnopqrstxyz
;结果 = abcdefghijklmnopqrstxyz

我做错了什么,还是我根本无法在 iostream 中插入?

C++ STL IOstream :fstream

评论

0赞 Hayt 8/31/2016
您是在检查末尾的流内容还是文件的内容?只是在这里猜测,但也许 fstream 在销毁或某些文件同步时进行了隐式刷新,而 iostream 没有。最后您可以尝试冲洗。

答:

3赞 Bo Persson 8/31/2016 #1

通用的 iostream 是不可搜索的 - 想想键盘或打印机。

您不检查操作的结果。它可能会失败并将流设置为错误状态。然后,任何进一步的输出尝试都将不执行任何操作。seekp