gpt4 book ai didi

c++ - fstream seekg()、seekp() 和 write()

转载 作者:IT老高 更新时间:2023-10-28 21:47:21 33 4
gpt4 key购买 nike

我正在寻找一些关于 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保存单个文件位置

§ 27.9.1.1

  1. The class basic_filebuf associates both the input sequence and the output sequence with a file.
  2. The restrictions on reading and writing a sequence controlled by an object of class basic_filebuf are the same as for reading and writing with the Standard C library FILEs.
  3. In particular:
    • If the file is not open for reading the input sequence cannot be read.
    • If the file is not open for writing the output sequence cannot be written.
    • A joint file position is maintained for both the input sequence and the output sequence.

这意味着当你使用 std::basic_fstream 时,默认情况下使用 std::basic_filebuf,单个文件的位置会被两个 seekp()seekg();除非您使用单独的变量来存储其中一个位置,以便您随后可以回溯到它,否则您无法独立跟踪 put 和 get 位置。

第 2 点的含义是,在 fstream 上的读取和写入之间,当从输出更改为输入时,您必须刷新缓冲区或查找文件位置,并且您必须在末尾文件的位置或从输入更改为输出时寻找文件位置。

有关这些限制的详细信息,请参阅 C99 标准的第 7.19.5.3/7 节(“fopen 函数”)或 C11 的第 7.21.5.3/7 节。

关于c++ - fstream seekg()、seekp() 和 write(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15670359/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com