C ++在特定位置的文件中覆盖数据

时间:2011-09-04 15:40:48

标签: c++ file-io

我在用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,文件的内容将被删除。 感谢。

2 个答案:

答案 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 )应该尝试超越文件位置的当前末尾。