我在用c ++覆盖文件中的某些数据时遇到问题。我使用的代码是
int main(){
fstream fout;
fout.open("hello.txt",fstream::binary | fstream::out | fstream::app);
pos=fout.tellp();
fout.seekp(pos+5);
fout.write("####",4);
fout.close();
return 0;
}
问题是即使在使用seekp之后,数据总是写在最后。我想把它写在特定的位置。 如果我不添加fstream :: app,文件的内容将被删除。 感谢。
答案 0 :(得分:10)
问题在于fstream::app
- 它会打开要附加的文件,这意味着所有写入都会转到文件的末尾。为避免内容被删除,请尝试使用fstream::in
打开,意味着使用fstream::binary | fstream::out | fstream::in
打开。
答案 1 :(得分:4)
你想要像
这样的东西fstream fout( "hello.txt", fstream::in | fstream::out | fstream::binary );
fout.seek( offset );
fout.write( "####", 4 );
fstream::app
告诉它在每次输出操作之前移动到文件的末尾,所以即使你明确地寻找某个位置,当你执行write()
时,写入位置也会被强制结束。 (即seekp( 0, ios_base::end );
)。
比照http://www.cplusplus.com/reference/iostream/fstream/open/
需要注意的另一点是,由于您使用fstream::app
打开了文件,tellp()
应该返回文件的末尾。所以seekp( pos + 5 )
应该尝试超越文件位置的当前末尾。