Duda sobre fread() en C++

Todo aquello que no está relacionado con Gemix Studio ni con la programación DIV en general.
Post Reply
User avatar
erkosone
Posts: 10656
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.
Contact:

Duda sobre fread() en C++

Post by erkosone »

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]
User avatar
GINO
Posts: 2823
Joined: Thu Jul 31, 2008 10:25 pm
Contact:

Re: Duda sobre fread() en C++

Post by GINO »

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.
User avatar
necro_vampire
Posts: 1372
Joined: Fri Oct 10, 2008 12:38 am
Location: Death Soul city???
Contact:

Re: Duda sobre fread() en C++

Post by necro_vampire »

[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
Image
Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.
User avatar
erkosone
Posts: 10656
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.
Contact:

Re: Duda sobre fread() en C++

Post by erkosone »

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.
User avatar
necro_vampire
Posts: 1372
Joined: Fri Oct 10, 2008 12:38 am
Location: Death Soul city???
Contact:

Re: Duda sobre fread() en C++

Post by necro_vampire »

erkos, no digo que no funcione, sino que va a leer una posicion fuera del archivo
Image
Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.
User avatar
erkosone
Posts: 10656
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.
Contact:

Re: Duda sobre fread() en C++

Post by erkosone »

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 ;)
User avatar
necro_vampire
Posts: 1372
Joined: Fri Oct 10, 2008 12:38 am
Location: Death Soul city???
Contact:

Re: Duda sobre fread() en C++

Post by necro_vampire »

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 ;)
exacto.
pero creo que debes tener cuidado cuando lees una cantidad de bytes y el archivo tiene menos de esa cantidad.
La 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.
http://c.conclase.net/librerias/?ansifun=fread
Image
Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.
Post Reply

Return to “Offtopic”