Tengo este bucle que no entiendo muy bien cuando se rompe.. alguien puede aclararme si el bucle termina cuando fread retorna un error?? creo que es así pero no estoy seguro al 100%.. creo que va leyendo short´s que es el tamaño de 'value' y cuando no hay mas datos por leer se rompe el bucle?? alguien puede confirmarme que es así exactamente?
[Codebox=cpp file=Untitled.cpp]while( fread(&value,sizeof(value),1,wav) ) {
// fprintf(stderr,"%d\n", value);
if (value<0) { value=-value; }
sum += value;
cout << value << endl;
}[/Codebox]
Duda sobre fread() en C++
- erkosone
- Posts: 10656
- Joined: Tue Feb 24, 2009 2:13 pm
- Location: Barcelona.
- Contact:
- GINO
- Posts: 2823
- Joined: Thu Jul 31, 2008 10:25 pm
- Contact:
Re: Duda sobre fread() en C++
No está muy bien usar eso así creo yo. fread te devuelve el número de bytes leídos. Si se corresponde con el número que quieres es que ha leído todos, sino es que hubo un error o se llego al final del archivo y no pudo leer todo. En ese código debe estar suponiendo que le va a devolver 0 cuando no hay más bytes por leer y entonces sale del bucle. Pero es mejor práctica usar el eof que ese método creo.
- necro_vampire
- Posts: 1372
- Joined: Fri Oct 10, 2008 12:38 am
- Location: Death Soul city???
- Contact:
Re: Duda sobre fread() en C++
[url]http://es.wikibooks.org/wiki/Programación_en_C/Manejo_de_archivos[/url]
(da error al colocar el enlace por el tilde?? si la direccion es con tilde LOL)
en los archivos se avanza secuencialmente, en tu bucle no preguntas si se llego al final del archivo, seguro va a leer fuera del rango del archivo
mientras no se llego al final del archivo (EOF), se lee (o lo que quieras
(da error al colocar el enlace por el tilde?? si la direccion es con tilde LOL)
en los archivos se avanza secuencialmente, en tu bucle no preguntas si se llego al final del archivo, seguro va a leer fuera del rango del archivo
mientras no se llego al final del archivo (EOF), se lee (o lo que quieras

Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.
- erkosone
- Posts: 10656
- Joined: Tue Feb 24, 2009 2:13 pm
- Location: Barcelona.
- Contact:
Re: Duda sobre fread() en C++
Necro ese bucle funciona bien, no es mio, por eso no me quedaba claro como funcionaba, he visto que lee 1 byte por tirada, así que es lo que dice gino, cuando llegue al final del archivo retronará cero por que no leerá nada y saldrá.
Vale gracias, ahora me queda mas claro.
Vale gracias, ahora me queda mas claro.
http://iphonegamesdev.com/
[GEMIX - VIDEO TUTORIALES] http://www.youtube.com/user/fasetconasa
http://gurugameprogramming.blogspot.com.es/
[GEMIX - VIDEO TUTORIALES] http://www.youtube.com/user/fasetconasa
http://gurugameprogramming.blogspot.com.es/
- necro_vampire
- Posts: 1372
- Joined: Fri Oct 10, 2008 12:38 am
- Location: Death Soul city???
- Contact:
Re: Duda sobre fread() en C++
erkos, no digo que no funcione, sino que va a leer una posicion fuera del archivo

Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.
- erkosone
- Posts: 10656
- Joined: Tue Feb 24, 2009 2:13 pm
- Location: Barcelona.
- Contact:
Re: Duda sobre fread() en C++
haa vale, claro, y como no la va a poder leer retornará cero y se romperá el bucle, en el fondo estabamos diciendo lo mismo con distintas palabras 
http://iphonegamesdev.com/
[GEMIX - VIDEO TUTORIALES] http://www.youtube.com/user/fasetconasa
http://gurugameprogramming.blogspot.com.es/
[GEMIX - VIDEO TUTORIALES] http://www.youtube.com/user/fasetconasa
http://gurugameprogramming.blogspot.com.es/
- necro_vampire
- Posts: 1372
- Joined: Fri Oct 10, 2008 12:38 am
- Location: Death Soul city???
- Contact:
Re: Duda sobre fread() en C++
exacto.erkosone wrote:haa vale, claro, y como no la va a poder leer retornará cero y se romperá el bucle, en el fondo estabamos diciendo lo mismo con distintas palabras
pero creo que debes tener cuidado cuando lees una cantidad de bytes y el archivo tiene menos de esa cantidad.
http://c.conclase.net/librerias/?ansifun=freadLa función fread retorna el número de caracteres leídos correctamente, el cual puede ser menor que nmemb si se encuentra un error de lectura o un final de fichero. Si tamanyo o nmemb es cero, fread retorna cero, y el contenido del array y el estado del stream permanecen invariados.

Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.