使用fstream同时读写

use fstream to read and write in the same time

我正在学习如何从文件中读取和写入。有一个问题,当我尝试在读取文件后写入(例如文件字母中的某些内容--)或写入文件后读取 使用 fstream
出了点问题。我试着只写或读,但它奏效了。有什么问题?

文件内容为:

abcdefgh
ijklmnopqr
stuvw
xyz

代码是:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
fstream ioFile;
    char ch;
    ioFile.open("search.txt", ios::in | ios::out);
    if (!ioFile)
    {
        cout << "problem opening the file";
        goto k270;
    }
    
    while (ioFile>>ch)
    {
        if (ch == 'z')
        {
            ioFile.seekp(((int)ioFile.tellg()));
             ioFile << "x";
            
            
        }
    }


    //cout<<ioFile.rdbuf();
    ioFile.close();
    k270:
    system("pause");
    return 0;
}

看看这个答案: 它解释了您遇到的错误。

简短版本:输入和输出被缓冲,只有在您强制更新缓冲区之间的缓冲区时,交错读写才有效。

这对我有用:

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

int main()
{
    std::fstream ioFile;
    char ch;
    ioFile.open("search.txt", std::ios::in | std::ios::out);
    if (!ioFile)
    {
        std::cout << "problem opening the file";
        return 1;
    }

    while (ioFile >> ch)
    {
        if (ch == 'z')
        {
            ioFile.seekp(-1, std::ios_base::cur);
            ioFile << "x";
            ioFile.flush();
        }
    }

    ioFile.close();
    return 0;
}

不同的是我用ioFile.seekp(-1, std::ios_base::cur);cur租的位置往后退了一步。您也可以使用 ioFile.seekp((int)ioFile.tellg() -1); - 注意 -1.

然后后退并覆盖 z 后,使用 ioFile.flush(); 强制将写入推送到文件。这也意味着读取缓冲区已更新,否则读取操作只会退回其缓冲区并继续读取相同的缓冲 z。