Я пытаюсь переопределить 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?
"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+
— добавить; открыть или создать двоичный файл для обновления, запись в конец файла
Открытие в режиме «ab» приведет к добавлению байтов в конец файла, вам нужно использовать режим «wb» вместо того, чтобы перезаписывать байты.