Erreur à la lecture

deadbird Messages postés 49 Date d'inscription mercredi 15 janvier 2003 Statut Membre Dernière intervention 7 mars 2010 - 7 mars 2010 à 18:39
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 - 8 mars 2010 à 12:35
hello ;)
J'ai ici une fonction qui ouvre un fichier WAV, et le fread ne fonctionne pas, impossible de comprendre pourquoi...quelqu'un a une idée?
int openWaveFile(char* file) {
unsigned long size;
errCode = 0;

/*Does the file has the .wav extension?*/
if (!strstr(file, ".wav"))
ERR(1);

/*open file for reading*/
if ((fp fopen(file, "r")) NULL)
ERR(2);

/*get size*/
fseek(fp, 0, SEEK_END);
size = ftell(fp);
fseek(fp, 0, SEEK_SET);

/*allocates the whole buffer*/
if(!(buffer = (unsigned char*)malloc(size * sizeof(unsigned char))))
ERR(5);

/*read the whole file and close it*/
if (fread((void*)&buffer, sizeof(unsigned char), size, fp) != size)
ERR(3);
fclose(fp);

/*header's at the very beginning*/
header = (struct WAV_HEADER *)buffer;

/*Then check it!*/
if (header->declare.riffTag[0] != 'R' ||
header->declare.riffTag[1] != 'I' ||
header->declare.riffTag[2] != 'F' ||
header->declare.riffTag[3] != 'F') ERR(4);
if (header->declare.waveTag[0] != 'W' ||
header->declare.waveTag[1] != 'A' ||
header->declare.waveTag[2] != 'V' ||
header->declare.waveTag[3] != 'E') ERR(4);
if (header->header.formatBlockID[0] != 'f' ||
header->header.formatBlockID[1] != 'm' ||
header->header.formatBlockID[2] != 't') ERR(4);

data_pos.buffer = buffer;
data_pos.bufferSize = size;
data_pos.bytesPerSample = header->header.bytesPerSample;

end:
if (fp) fclose(fp);
return errCode;
}

2 réponses

deadbird Messages postés 49 Date d'inscription mercredi 15 janvier 2003 Statut Membre Dernière intervention 7 mars 2010
7 mars 2010 à 19:16
oups:
fread((void*)buffer, sizeof...

mais ca ne change rien à mon problème :(
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
8 mars 2010 à 12:35
Salut,

Pour commencer, comment est-ce que ça se fait que la plupart des variables utilisées ne soient pas déclarées ? Rien que pour ça je ne vois même pas pourquoi ça devrai compiler. Quand aux multiples casts, c'est moche, ça sert à rien et c'est sujet à dissimulation de bugs (ou bien peut-être utilises-tu en réalité un compilateur C++).

Sinon, vu que buffer semble être un unsigned char* alors il faut faire comme dans ton second post (mais sans le cast de préférence).

Soit dit en passant, fclose() ne met pas le pointeur sur le flux à NULL, donc ton "if (fp)" sera toujours vrai et ton close doit s'effectuer 2 fois si aucune erreur ne se produit.
0