Замена данных в двоичном файле с помощью fstream и seekp - PullRequest
2 голосов
/ 01 апреля 2011

Я пишу метод для замены указанной строки из двоичного файла, и он записывает NULL до позиции, которую я установил с помощью seekp, затем записывает строку и закрывает поток. Я только хочу заменить несколько байтов в файле. Перед этим фрагментом кода я пробовал использовать ofstream с флагами ios :: binary и ios :: out. Что плохого, чтобы уничтожить все данные в файле? Перед этим фрагментом кода я открываю файл с экземпляром ifstream, чтобы прочитать ту же позицию, проверяя первый байт в строке. Я комментирую это только для информации.

Спасибо всем!

Код:

fstream ofs();
ofs.open(nomArchBin,ios::in | ios::out | ios::binary);

if (!ofs.good()) {
    cout << "...";
    return;
}

ofs.seekp(despEnArchivo,ios::beg);
char* registroChar = registroACadena(reg);
ofs.write(registroChar,cabecera.tamanioReg);

1 Ответ

3 голосов
/ 01 апреля 2011

Я знаю, это звучит глупо, но единственный способ открыть файл для записи и не урезать его - значит открыть его для чтения: если вы действительно делает ios::in | ios::out | ios::binary, это должно работать. (Но так как вы, очевидно, повторно вводили код и не копировали / вставляли его, я не уверен, что это действительно то, что ты сделал.)

Другие моменты, на которые нужно обращать внимание при поиске:

  • Файл должен быть открыт в двоичном режиме и пропитан знаком "C" локали. (IMHO, файл, открытый в двоичном режиме, должен игнорировать локаль, но это не то, что говорит стандарт.)
  • Оба `seekg` и` seekp` имеют одинаковый эффект; используя либо изменяет положение другого.
  • Единственная функция, которая позволяет искать в произвольном месте два аргумента искать; форма с одним аргументом может использоваться только для поиска позиция, ранее полученная сообщением.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...