Проблема с seekp (), seekg (), read () и write () в одном файле - PullRequest
1 голос
/ 21 мая 2011

Я имею дело с проблемой файлов в 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 Ответ

3 голосов
/ 21 мая 2011

Это не работает

f->seekg(readPosition,ios::beg);
f->seekp(writePosition,ios::beg);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...