C: редактирование двоичного файла - PullRequest
1 голос
/ 16 января 2012

Вот проблема: я должен изменить заголовок файла WAVE, а точнее, изменить ChunkSize и SubChunk2Size.Проблема в том, что эти значения используют 4 байта, но кажется, что при использовании fwrite я перезаписываю 8 байтов:

оригинал:

RIFFđ WAVEfmt

отредактировано:

RIFF(}   }  fmt

код:

FILE *nova;
nova=fopen ( "nova.wav", "wb" );

fseek ( nova, 4, SEEK_SET );
fwrite ( &brojacC,4,1,nova );
fseek ( zvuk, 44, SEEK_SET );
fwrite ( &brojacCS2,4,1,nova );

В отредактированном файле WAVE перезаписан.Что-то пошло не так, потому что я начал с 4-го байта и написал 4 байта, а WAVE начинается с 8-го байта.

Надеюсь, я был хотя бы немного ясен.Можно ли это сделать другим способом?

Ответы [ 2 ]

3 голосов
/ 16 января 2012

Ну, по моим man fopen выводам:

   r      Open  text  file  for  reading.  The stream is positioned at the
          beginning of the file.

   r+     Open for reading and writing.  The stream is positioned  at  the
          beginning of the file.

   w      Truncate  file  to  zero length or create text file for writing.
          The stream is positioned at the beginning of the file.

   w+     Open for reading and writing.  The file is created  if  it  does
          not  exist, otherwise it is truncated.  The stream is positioned
          at the beginning of the file.

   a      Open for appending (writing at end of file).  The file  is  cre‐
          ated  if it does not exist.  The stream is positioned at the end
          of the file.

   a+     Open for reading and appending (writing at end  of  file).   The
          file is created if it does not exist.  The initial file position
          for reading is at the beginning  of  the  file,  but  output  is
          always appended to the end of the file.

При этом я определенно выбрал бы fopen("nova.wav", "r+b"), так как w, похоже, обрезает файл, и вы читаете перед записью, в то время как a добавляет в конец файла, и вы хотите переписать часть файла.

2 голосов
/ 16 января 2012

В этом коде есть по крайней мере одна ошибка в каждой показанной строке.

FILE *nova;

Проще сделать правильную обработку ошибок, если вы будете делать такие вещи с open, write иlseek вместо fopen, fwrite и fseek.

nova=fopen ( "nova.wav", "wb" );

Вторая строка должна быть "r+b" вместо "wb", чтобы вы не усекали файл.Вам нужно проверить на наличие ошибок.

fseek ( nova, 4, SEEK_SET );

Вам необходимо проверить на наличие ошибок.

fwrite ( &brojacC,4,1,nova );

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

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

fseek ( zvuk, 44, SEEK_SET );

Это работает с несвязанным дескриптором файла zvuk, а не nova.И вам нужно проверить на наличие ошибок.

fwrite ( &brojacCS2,4,1,nova );

Поскольку вызов fseek в предыдущей строке был применен к zvuk, запись производится со смещением 4 + 4 = 8, а не со смещением 44, как было запланировано,Все комментарии в предыдущей строке fwrite также относятся к этой строке.(Psst: Вам нужно проверить на ошибки.)

Несоответствующий интервал между запятыми, кстати, приглашает богов ударить вас молнией.То же самое можно сказать и о пробелах внутри скобок.

...