【问题标题】:C++ deleting or overwriting existing information in a fileC++ 删除或覆盖文件中的现有信息
【发布时间】:2018-04-09 04:50:18
【问题描述】:

在 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 字节的读取,但在操作系统/硬件级别上,来自文件的单个负载要大得多。这样做是为了优化,因为访问硬盘很慢。
  • 我正在尝试将文件用作数据库 (^.^) - 这是要安装在资源极其有限的机器上,因此只有标准 C++ 库可用。

标签: c++ file fstream iostream


【解决方案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;
}

【讨论】:

  • 我用哪个函数来写?当我这样做时,它会给我留下一个只包含字母“Q”的文件。似乎不适用于 f.put(、f.write( 或 f
  • @Arlington 它应该...但是没有您的实际代码,我几乎无法告诉您。也许将新代码附加到问题中?
  • 已修复;没有注意到我必须以 std::ios::in 的身份打开 | std::ios::out 用于输出操作。谢谢。
猜你喜欢
  • 1970-01-01
  • 2018-09-07
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 2014-01-10
相关资源
最近更新 更多