Проблема с seekp(), seekg(), read() и write() в одном файле
Я имею дело с проблемой с файлами в C++, я не могу решить. Я управляю файлом с регистрами и пытаюсь сделать "Sorted Insert", по-испански это "Insercción ordenada", но я не знаю перевода на английский. Я пытаюсь открыть файл в конце и сравнить регистр с регистром, который я хочу вставить в файл. Каждый регистр больше нового перемещается на одну позицию регистра в конец файла. Я записываю новый регистр в правильное положение, когда сравнение возвращает, что новый меньше, чем текущий выбранный.
Моя конкретная проблема - последний регистр в файле читается 2 раза, и из-за этого регистр записывается 2 раза.
Я хотел бы скопировать код, который я написал, но названия на испанском языке, и код содержит множество фрагментов для управления ошибками и преобразованиями между символами * и структурами... Это беспорядок, и это только сбивает нас с толку.
Я думаю, что кто-то был бы в такой же ситуации, я буду благодарен за примеры в Интернете или некоторые статьи о том, как использовать seekp и seekg для одного и того же файла.
Большое спасибо!
Более или менее код:
int readPosition, writePosition;
readPosition = // Byte where the last register starts in the file.
writePosition = readPosition + registerSize;
f->seekg(readPosition,ios::beg);
oldReg = new char[registerSize];
f->read(oldReg,registerSize);
f->seekp(writePosition,ios::beg);
while () { // if cadena < new register
// For writing, I need to move the reading pointer after the writing pointer
f->seekg(readPosition + 2*registerSize,ios::beg);
f->write(oldReg,registerSize);
readPosition -= registerSize;
writePosition -= registerSize;
f->seekg(readPosition,ios::beg);
f->seekp(writePosition,ios::beg);
delete oldReg;
oldReg = new char[registerSize];
f->read(oldReg,registerSize);
}
delete oldReg;
f->seekp(writePosition,ios::beg);
f->seekg(writePosition + registerSize,ios::beg);
f->write(newRegister,registerSize);
Это не настоящий код, но то, что делает мой метод. Я хочу, чтобы вы заметили, как я использую seekp() и seekg(), потому что я не уверен в том, как я их использую. У меня было несколько проблем с поиском и поиском, и я заметил, что два указателя очень совпадают.
1 ответ
Это не работает
f->seekg(readPosition,ios::beg);
f->seekp(writePosition,ios::beg);
Файл имеет только одну позицию. Вы должны выполнять свои поиски, когда они вам нужны, при переходе от чтения к письму или наоборот.