当我这样做时
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个字节,而其余部分不受影响。
答案 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将文件指针设置在文件的开头。