我正在处理一个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
我一直在搜索这个问题大约一个小时,但我找不到任何相关的东西。我遇到的唯一一件事就是说使用.seekp
和ios :: end
的人应该用零填补空白,但我尝试了它并不适用于我。
如果有帮助,我会使用VS2010本机编译。如果你能提供一个提示,那么非常感谢。
答案 0 :(得分:1)
简短 .seekp()
如果先前已与.seekg()
达成文件结尾,则会失败,因此需要事先致电.clear()
。
<强>长:强>
我发现我的写入操作失败了,因为我首先使用.seekg()
在文件结尾处找到了一个位置,并通过首先检查.eof()
是否返回来验证该位置是否有数据false,然后使用.peek()
查找非空字符。
问题是,即使.seekg()
到达文件结尾,.eof()
似乎总是返回false,直到尝试任何读取/查看/获取操作,并且.peek()
返回超过文件结尾的任何位置的非空值(-1)。
因此,解决方案是在检查是否已达到文件结尾之前检查非空字符,和(如果是文件末尾),在.clear()
之前调用.seekp()
,它解决了所有问题。