2012-01-16 4 views
1

여기에 문제가 있습니다. 정확히 내가 ChunkSize 및 SubChunk2Size를 변경해야한다는 WAVE 파일의 헤더를 변경해야합니다.C : 바이너리 파일 편집

일본어 : 편집

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); 
그 값은 4 바이트를 사용하지만, i가 8 바이트를 덮어에 fwrite하여 해당 seemt하는 문제는

편집 된 파일 WAVE을 덮어 씁니다. 4 번째 바이트에서 시작하여 4 바이트를 작성했으며 WAVE은 8 번째 바이트에서 시작하기 때문에 문제가 발생했습니다.

나는 적어도 조금은 분명했으면 좋겠다. 다른 방법으로도이 작업을 수행 할 수 있습니까?

답변

3

글쎄, 내 man fopen 출력에 따라 : a가 추가 동안

말했다되고 그건
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. 

, 나는 확실히 당신이 쓰기 전에 읽고 w 파일을자를 것 같은 fopen("nova.wav", "r+b")을 위해 이동 한 것 파일의 끝 부분이며 파일의 일부를 다시 쓰려고합니다.

2

이 코드에는 표시된 각 줄마다 하나 이상의 버그가 있습니다.

FILE *nova; 

그것은 오류가 당신이 open, writelseek보다는 fopen, fwritefseek으로 이런 종류의 할 권리 경우 처리 얻을하는 것이 더 쉽습니다.

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

두 번째 문자열은 그래서 당신이 파일을 절단하지 않는 "r+b" 대신 "wb"해야한다. 오류가 있는지 확인해야합니다.

fseek (nova, 4, SEEK_SET); 

오류가 있는지 확인해야합니다.

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

fwrite 항상 제 1 인자 및 기록 될 데이터의 크기와 동일한 제 인자로 호출한다; 그렇지 않으면 짧은 쓰기에서 복구 할 수 없습니다. 짧은 쓰기 및 쓰기 오류가 있는지 확인해야합니다.

brojacC을 초기화하는 코드를 표시하지 않으므로 엔디안 또는 구조체 패딩 문제가 있는지 여부를 평가할 수 없지만 실제로 할 수는 있습니다.

fseek (zvuk, 44, SEEK_SET); 

이는 관련이없는 파일 핸들 zvuk보다는 nova에서 작동합니다. 오류가 있는지 확인해야합니다. 이전 행에 fseek 호출 zvuk인가 된 이후 4 + 4 = 8 오프셋에

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

,이 의도로, 44을 상쇄하지 쓴다.이전 fwrite 행에 대한 모든 주석도이 행에 적용됩니다. (Psst : 오류가 있는지 확인해야합니다.)

쉼표를 사용하지 않고 띄어쓰기를하면 신들이 번개를 치도록 초대합니다. 그래서 당신의 괄호 안쪽에 공간을 두는 것입니다.