如何在文件末尾以外的特定地址写入

How to write at a specific address past end of file

本文关键字:地址 文件      更新时间:2023-10-16

我正在使用一个fstream对象,我想知道如何在文件末尾写入一些东西,而不必手动用零填充 eof 和所需位置之间的空间?

例:

fstream someFile;
someFile.open("foo.dat", ios :: out | ios :: trunc | ios :: binary); // file is created, and empty
someFile.seekp(100, ios :: beg); // expecting 100 zeroes to be written in file, but nothing happens
someFile.write("yodelay-hee-hoo", 15); // file is still empty, does not work

我已经在这个问题上搜索了大约一个小时,但我找不到任何相关的东西。我唯一遇到的是有人说将.seekpios :: end一起使用应该用零来填补空白,但我尝试过,它对我不起作用。

如果有帮助,我使用的是VS2010,本机编译。如果您可以提供提示,请表示感谢。

Short:如果之前使用 .seekg() 到达文件末尾,则.seekp()失败,因此需要事先调用.clear()


长:

我发现我的写入操作失败了,因为我首先用 .seekg() 寻找文件末尾的位置,并通过首先检查.eof()是否返回 false 然后查找带有 .peek() 的非空字符来验证该位置是否有数据。

问题是,即使.seekg()到达文件末尾,.eof()似乎也总是返回 false,直到尝试任何读取/查看/获取操作,并且.peek()为文件末尾之后的任何位置返回非空值 (-1)。

因此,解决方案是在检查是否到达文件末尾之前检查非空字符,如果超过文件结尾,则在.seekp()之前调用 .clear(),它解决了所有问题。