deadbird
Messages postés49Date d'inscriptionmercredi 15 janvier 2003StatutMembreDernière intervention 7 mars 2010
-
7 mars 2010 à 18:39
TychoBrahe
Messages postés1309Date d'inscriptionsamedi 31 janvier 2009StatutMembreDerniè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;
}
TychoBrahe
Messages postés1309Date d'inscriptionsamedi 31 janvier 2009StatutMembreDernière intervention 5 juin 201312 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.