Проблема с 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);

Файл имеет только одну позицию. Вы должны выполнять свои поиски, когда они вам нужны, при переходе от чтения к письму или наоборот.

Другие вопросы по тегам