Я пытаюсь записать существующий пустой двоичный файл размером 1 МБ с помощью C++ в определенной позиции.
ofstream of( filename, ofstream::binary );
of.seekp(1600, of.beg);
of.write(arr, 1024);
of.close();
Пустой файл создается путем записи этого буфера в файл до:
char *buffer = (char*)malloc(size);
memset(buffer, ' ', size);
Но этот код просто обрезает весь пустой файл пробела 1 МБ и записывает это содержимое 1 КБ, а размер файла становится 1 КБ.
Пробовал использовать app
а также режим ate
. Когда я попробовал режим app
следующим образом:
ofstream of( filename, ofstream::binary | ofstream::app );
of.seekp(1600, of.beg);
of.write(arr, 1024);
of.close();
Он добавляет содержимое в конец файла. Таким образом, файл становится размером 1 МБ + 1 КБ.
То, что я пытаюсь сделать, это перезаписать 1KB-данные (в настоящее время это пустое пространство) в файле с некоторыми данными. Так что он не изменит размер файла или другие данные.
Где я делаю это неправильно?
использование
ofstream of( filename, ofstream::binary | ofstream::in | ofstream::out)
для открытия бинарного файла для обновления.
См. С++ 11 Таблица 123 - Режимы открытия файлов (в 27.9.1.4/3):
Table 132 — File open modes
ios_base flag combination stdio
binary in out trunc app equivalent
---------------------------------------------------
+ "w" truncate/create for writing
+ + "a" append - writes automatically seek to EOF
+ "a"
+ + "w"
+ "r" open for read
---------------------------------------------------
+ + "r+" open for update (reading and writing)
+ + + "w+" truncate/create for update
+ + + "a+" open or create for update - writes seek to EOF
+ + "a+"
---------------------------------------------------
+ + "wb" All same as above, but in binary mode
+ + + "ab"
+ + "ab"
+ + + "wb"
+ + "rb"
---------------------------------------------------
+ + + "r+b"
+ + + + "w+b"
+ + + + "a+b"
+ + + "a+b"
::in
?