Я ищу некоторые разъяснения относительно того, как 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()
.