1

当我做

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

4 回答 4

2

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

ATM 我无法检查我的参考资料,所以一定要仔细检查,但我相信这是准确的。

于 2009-04-27T02:11:31.720 回答
2

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

要在文件中间任意位置执行此操作,您需要找到正确的位置。您可以通过打开文件输入和输出来执行此操作,但如果我是您,我会创建一个临时文件,将输入复制到标记,写入新数据,将其余数据复制到 EOF,关闭文件并替换以前的文件带有临时文件的版本。这称为“主文件更新”。

于 2009-04-27T02:16:10.630 回答
2

由于文件已经存在,以“读+写”模式打开它,然后执行 seekp。我认为它会起作用。

fstream someFile("something.dat", ios::binary|ios::out|ios::in);
someFile.seekp(someLocation, ios::beg);
someFile.write(someData, 100);
于 2009-04-27T13:29:26.783 回答
1

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

于 2009-04-27T02:12:25.100 回答