繁体   English   中英

fstream替换文件的一部分

[英]fstream replace portion of a file

当我做

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个字节,而其余部分不受影响。

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

ATM我无法检查我的引用,因此请务必仔细检查,但我认为这是准确的。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM