2012-01-16 5 views
1

Voici le problème: Je dois changer l'en-tête du fichier WAVE, pour être exact, je dois changer ChunkSize et SubChunk2Size. Le problème est que ces valeurs utilisent 4bytes mais il SEEMT que l'utilisation fwrite i écrasent 8 octets:C: édition du fichier binaire

l'original:

RIFFđ WAVEfmt 

édité:

RIFF(} } fmt 

Code:

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); 

Le fichier modifié WAVE est remplacé. Quelque chose s'est mal passé parce que j'ai commencé au 4ème octet et ai écrit 4 octets et WAVE commence au 8ème octet.

J'espère que j'étais au moins un peu clair. Cela peut-il être fait d'une autre manière?

Répondre

3

Eh bien, selon ma man fopen sortie:

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. 

Cela dit, je serais certainement aller pour fopen("nova.wav", "r+b"), comme w semble tronquer le fichier, et vous lisez avant d'écrire, tandis que a ajoute à la fin du fichier, et vous voulez réécrire une partie du fichier.

2

Ce code a au moins un bug sur chaque ligne affichée.

FILE *nova; 

Il est plus facile de l'erreur de manipulation à droite si vous faites ce genre de chose avec open, write et lseek plutôt que fopen, fwrite et fseek.

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

La deuxième chaîne doit être "r+b" au lieu de "wb" de sorte que vous ne tronque pas le fichier. Vous devez vérifier les erreurs.

fseek (nova, 4, SEEK_SET); 

Vous devez vérifier les erreurs.

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

fwrite doit toujours être appelé avec le deuxième argument 1 et troisième argument égal à la taille des données à écrire; sinon, il est impossible de récupérer des écritures courtes. Vous devez vérifier les écritures courtes et écrire des erreurs.

Vous ne montrez pas le code qui initialise brojacC donc je ne peux pas évaluer si vous avez des problèmes d'endianness ou de rembourrage de structure, mais je parie que oui.

fseek (zvuk, 44, SEEK_SET); 

Celui-ci fonctionne sur la poignée de fichiers sans rapport avec zvuk plutôt que nova. Et vous devez vérifier les erreurs.

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

Depuis l'appel fseek sur la ligne précédente a été appliquée à zvuk, ce écrit à l'offset 4 + 4 = 8, pas compensé 44 comme il était prévu.Tous les commentaires sur la ligne fwrite précédente s'appliquent également à cette ligne. (Psst: Vous devez vérifier les erreurs.)

Un espacement incohérent autour des virgules, en passant, invite les dieux à vous frapper avec la foudre. Il en va de même pour mettre des espaces à l'intérieur de vos parenthèses.