fseek вернуться к концу файла при записи значения

Я пытаюсь переопределить 4 байта в позиции 4 в файле, но, похоже, fseek не работает.

Мой код:

int r = fseek(cacheStream, 4, SEEK_SET);
std::cout << "fseek returns " << r << std::endl;
std::cout << "ftell " << ftell(cacheStream) << std::endl;
r = fwrite(&chunckSize, sizeof(uint32_t), 1, cacheStream);
std::cout << "fwrite returns " << r << std::endl;
std::cout << "ftell " << ftell(cacheStream) << std::endl;

cacheStream был открыт с «ab». Выход:

fseek returns 0
ftell 4
fwrite returns 1
ftell 2822716

Значение не было переопределено, но вместо этого оно было записано в конце файла. Что может вызвать такое странное поведение с fseek?

2

Решение

"ab" Режим означает, что каждая запись будет добавлена ​​в файл независимо от положения перед записью.

Если вы этого не хотите, не используйте "a" флаг.

Добавлено позже:

Если вы открываете существующий файл для обновления, то "r+b" открывает файл для чтения и записи; "w+b" обрезает файл при его открытии, но позволяет прочитать то, что вы написали.

Стандарт C99 (ISO / IEC 9899: 1999 — не текущий стандарт, но это будет очень похоже) гласит:

§7.19.5.3 fopen функция

  • r — открыть текстовый файл для чтения
  • w — обрезать до нулевой длины или создать текстовый файл для записи
  • a — добавить; открыть или создать текстовый файл для записи в конце файла
  • rb — открыть бинарный файл для чтения
  • wb — обрезать до нулевой длины или создать двоичный файл для записи
  • ab — добавить; открыть или создать двоичный файл для записи в конце файла
  • r+ — открыть текстовый файл для обновления (чтение и запись)
  • w+ — обрезать до нулевой длины или создать текстовый файл для обновления
  • a+ — добавить; открыть или создать текстовый файл для обновления, запись в конец файла
  • r+b или же rb+ — открыть бинарный файл для обновления (чтение и запись)
  • w+b или же wb+ — обрезать до нулевой длины или создать двоичный файл для обновления
  • a+b или же ab+ — добавить; открыть или создать двоичный файл для обновления, запись в конец файла
9

Другие решения

Открытие в режиме «ab» приведет к добавлению байтов в конец файла, вам нужно использовать режим «wb» вместо того, чтобы перезаписывать байты.

5

По вопросам рекламы [email protected]