C++ 如何在超过文件末尾的特定地址写入
我正在使用一个C++ 如何在超过文件末尾的特定地址写入,c++,visual-studio-2010,file-io,stl,fstream,C++,Visual Studio 2010,File Io,Stl,Fstream,我正在使用一个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 writ
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,本机编译。如果您能提供提示,非常感谢。简短:
。如果以前使用.seekg()
到达文件结尾,seekp()
将失败,因此需要事先调用.clear()
长: 我发现我的写操作失败了,因为我首先用
.seekg()
查找了一个超过文件末尾的位置,并通过首先检查.eof()
是否返回false,然后用.peek()
查找非空字符来验证该位置是否有数据
问题是,即使.seekg()
到达文件末尾,.eof()
似乎总是返回false,直到尝试任何读取/peek/get操作,并且.peek()
对于超过文件末尾的任何位置返回非空值(-1)
因此,解决方案是在检查是否到达文件结尾之前检查非空字符,如果超过文件结尾,则在
之前调用.clear()
。seekp()
,它解决了所有问题。你说你想使用ios::end
,但你的代码说ios::beg
所以,seekp可能会将流设置为错误状态。错误是什么?你为什么不自己写这些零呢?它可能同样高效,并且会产生一个更加明确的代码。还是我遗漏了什么?但这对我不起作用-这是什么意思?它会产生错误吗?你不想用它吗?@KarthikT&@Björn:就我而言,使用ios::beg
要容易得多,但我的意思是,我确实尝试了ios::end
,但没有成功@海德:在seekp
之后,错误状态为7,与eofbit | failbit | badbit