我正在寻找有关seekg()
和seekp()
在写入文件时如何工作的说明。比如说我有一个像这样的文件:
offset 0: 2
offset 4: 4
offset 8: 6
offset 12: 8
offset 16: 10
现在,我想打开文件并进行一些读取和写入值的尝试。
fstream file;
file.open("file.txt", fstream::in |fstream::out | fstream::binary);
file.seekp(0, ios::end) // seek to the end of the file
int eofOffset = file.tellp(); // store the offset of the end-of-file, in this case 20
int key = 0;
file.seekg(12, ios::beg); // set the seek cursor to offset 12 from the beginning of the file
file.read((char *) &key, (int)sizeof(int)); // read in the next 4 bytes and assign it to key, in this case 8
file.seekg(8, ios::beg); // set the seek cursor to offset 8 from the beginning of the file
file.read((char *) &key, (int)sizeof(int)); // read in the next 4 bytes and assign it to key, in this case 6
现在我要写入文件末尾。由于
seekg()
函数仅移动搜索光标,因此我的seekp()
光标应该仍位于文件末尾,对吗?所以:int newKey = 12;
file.write((char *) &newKey, sizeof(int));
应该使我的文件现在看起来像:
offset 0: 2
offset 4: 4
offset 8: 6
offset 12: 8
offset 16: 10
offset 20: 12
现在,如果我选择寻找偏移量并将其值写为刚刚插入的值的偏移量,那么文件将发生什么情况。例如,我希望
offset 8
保留eofOffset = 20
,因为我们只是在该偏移量处插入了12。如果我做:
file.seekp(8, ios::beg);
file.write((char *) &eofOffset, sizeof(int));
是否正确重写了我的文件,如下所示:
offset 0: 2
offset 4: 4
offset 8: 20
offset 12: 8
offset 16: 10
offset 20: 12
如果我使用
seekg()
和seekp()
函数出错,请告诉我。 最佳答案
类模板std::basic_filebuf
保留单个文件位置
这意味着当您使用std::basic_fstream
(默认情况下使用std::basic_filebuf
)时,单个文件的位置会同时被seekp()
和seekg()
移动;除非您使用一个单独的变量来存储头寸之一,以便随后可以找回它,否则您将无法独立跟踪买入和卖出头寸。
第2点的含义是,在对fstream
进行读取和写入之间,从输出到输入的更改时,您必须刷新缓冲区或查找文件位置,并且在更改时必须位于文件末尾或查找文件位置从输入到输出。
有关这些限制的详细信息,请参见C99标准的7.19.5.3/7(“fopen
函数”)或C11的7.21.5.3/7。