fstream替换文件的一部分

时间:2009-04-27 01:58:36

标签: c++ io fstream

当我这样做时

fstream someFile("something.dat", ios::binary|ios::out);
someFile.seekp(someLocation, ios::beg);
someFile.write(someData, 100);

似乎用这100个字节替换整个文件而不是仅替换适当的100个字节,就好像我已经指定了ios :: trunc一样。是否有一种可移植的方法可以不截断文件?

编辑:添加ios :: in似乎可以解决问题,为什么需要这样做,并且是标准行为?

编辑#2:我没有尝试附加到现有文件。我需要替换100个字节,而其余部分不受影响。

4 个答案:

答案 0 :(得分:2)

AFAIR ios :: out仅指定文件用于输出和ios:binary仅指定文件是二进制文件。流的默认行为是创建新文件并覆盖旧文件。如果要修改现有文件,则必须使用ios :: app标志打开该文件。

ATM我无法检查我的参考文献,所以一定要仔细检查,但我认为这是准确的。

答案 1 :(得分:2)

如果要在文件末尾写入,则需要附加标志ios :: app。

要在文件中间任意处理,你需要寻找合适的地方。您可以通过打开和退出文件来执行此操作,但如果我是您,我将创建临时文件,复制输入到标记,写入新数据,将其余部分复制到EOF,关闭文件并替换以前的文件带有临时文件的版本。这称为“主文件更新”。

答案 2 :(得分:2)

由于文件已存在,请在“读取+写入”模式下打开,然后执行搜索。我认为它会奏效。

fstream someFile("something.dat", ios::binary|ios::out|ios::in);
someFile.seekp(someLocation, ios::beg);
someFile.write(someData, 100);

答案 3 :(得分:1)

ios:in mask告诉文件指针指向文件开头的位置,以便它可以从头开始读入。但是,您可能希望使用fseek将文件指针设置在文件的开头。