C ++删除或覆盖文件中的现有信息

时间:2017-10-27 14:30:09

标签: c++ file fstream iostream

C ++中有没有办法使用标准库覆盖大文件中的二进制数据并保留文件中的其余现有数据而不先加载整个文件?

示例:如果我有一个包含文本“ABC”的文件“MyFile”并想要用“Q”替换“A”,有没有办法在不将“BC”加载到内存中的情况下这样做?

到目前为止我所拥有的:

#include <fstream>

int main(int argc, char** argv)
{
    std::fstream f;
    f.open("MyFile",std::ios::in);
    while (f.good())
    {
        char Current = f.get();
        if (Current == 'A')
            break;
    }
    int Location = f.gcount()-1;
    f.close();

    if (Location < 0)
    {
        printf("Nothing to do.\n");
        return EXIT_SUCCESS;
    }
    else
    {
        f.open("MyFile",std::ios::in | std::ios::out);
        f.seekp(Location);
        f.write("Q",1);
        //f.put('Q');
        //f << "Q";
        f.close();
        return EXIT_SUCCESS;
    }
}

这似乎现在有效 - 谢谢大家。

1 个答案:

答案 0 :(得分:1)

std::ios::in | std::ios::out打开您的文件,然后当您拥有“A”的位置时,使用f.seekg(Location);将“输入插入符号”移回该位置并写入文件。

请记住,您只能替换/覆盖。你不能追加到文件的中间。

这应该有效:

#include <fstream>
#include <iostream>

int main()
{
    std::fstream f("d:\\file.txt", std::ios::in | std::ios::out);

    char c;

    while (f >> c)
    {
        if (c == 'A')
        {
            f.seekp(-1, std::ios_base::cur);
            f.put('Q');
            return EXIT_SUCCESS;
        }
    }

    std::cout << "Nothing to do." << std::endl;

    return EXIT_SUCCESS;
}