Autor
|
Tema: fread() - ¿como saber la cantidad de bytes leidos? (Solucionado) (Leído 1,618 veces)
|
AlbertoBSD
Estudiante y
Colaborador
 
Desconectado
Mensajes: 1.955
Anonymous & Paranoid
|
Que tal compañeros, tengo una duda, la verdad pensé que solucionarla era fácil pero no encuentro alguna función que me ayude. Esto viene de http://code.google.com/p/file2bits/source/browse/trunk/file2bits.c de la linea 97 y 98 uso fread y fwrite en distintos archivos. fread(buffer,size,1,in); fwrite(buffer,size,1,out); El buffer es de tamaño size, el problema es que siempre escribo size bytes en el archivo de salida, sin importar cuantos hubiese leído en fread. estaba haciendo lo siguiente: flag_read = fread(buffer,size,1,in); if(flag_read == 1) { fwrite(buffer,size,1,out); } else { //How many bytes were read? } Si el flag_read es igual a 1, entonces fread almaceno en buffer 1 objeto de tamaño size y entonces procedo a escribirlo normalmente. si no lo es entonces ¿como saber la cantidad de bytes leídos?Saludos
|
|
|
|
« Última modificación: 7 Febrero 2010, 17:49 por Anon »
|
En línea
|
|
|
|
[Zero]
Wiki
Desconectado
Mensajes: 1.050
CALL DWORD PTR DS:[0]
|
The fread function copies nmemb items of data of size size from the named input stream into an array pointed to by ptr. An item of data is a sequence of bytes (not necessarily terminated by a null byte) of length size. fread stops appending bytes when nmemb items have been read, end of file has been reached, or an error has occurred. Upon returning, fread sets the file pointer in the stream pointing to the byte past the last byte that has been read. The contents of stream remain unchanged. The fread function returns the number of items actually read. If nmemb is zero, no action is taken and the function will return 0.
Si lo entendí bien, mientras lee, fread va desplazando el puntero, así que con una resta deberías de poder saber cuando se pudo leer correctamente. Otra forma sería, luego de que se produjera un error, hacer otro fread leyendo byte por byte y contando cuantos se pudieron leer. No estoy muy familiarizado con las funciones de la CRT, así que puede ser que dijera una salvajada  . Saludos
|
|
|
|
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.” Nietzsche
|
|
|
AlbertoBSD
Estudiante y
Colaborador
 
Desconectado
Mensajes: 1.955
Anonymous & Paranoid
|
Gracias Hacker_Zero, apenas iba a postear que ya lo solucione: fread(buffer,size,1,in); fwrite(buffer,size,1,out); Codigo nuevo: flag_read = fread(buffer,sizeof(char),size,in); fwrite(buffer,flag_read,1,out); Me di cuenta que cuando estoy en fread, en lugar de especificar que lea 1 objeto de tamaño size, le puedo decir que lea size objetos de tamaño sizeof(char) Y ahora el flag_read almacena la cantidad de objetos leídos Al momento de hacer el fwrite solo le especifico que escriba un objeto de tamaño flag_read Ahora veo que tendré que cambiar el nombre de la variable, por bytes_read o algo asi xD Lo que tu mencionas también lo pensé a hacer, sin embargo ya veo que la solución es mas simple de lo que pensaba. Muchas gracias!!!
|
|
|
|
|
En línea
|
|
|
|
Littlehorse
All the world's a stage
Moderador
 
Desconectado
Mensajes: 2.707
Nie Dam Sie
|
El valor que devuelve fread es la cantidad de elementos leidos correctamente (el tercer parámetro de fread, size*3er parametro). En el caso que flag_read sea distinto del tercer parámetro de la función entonces o bien se ha producido un error o se ha alcanzado el final del archivo. O bien, haciéndolo al revés. result = fread (buffer,1,lSize,pFile); if (result != lSize) {fputs ("Reading error",stderr); exit (3);} http://www.cplusplus.com/reference/clibrary/cstdio/fread/Edit: Recién leí que lo habías solucionado, igual tienes que hacer una comparación mas. Un saludo!
|
|
|
|
« Última modificación: 7 Febrero 2010, 18:04 por Littlehorse »
|
En línea
|
 @NeedOfSecurityAn expert is a man who has made all the mistakes which can be made, in a very narrow field.
|
|
|
AlbertoBSD
Estudiante y
Colaborador
 
Desconectado
Mensajes: 1.955
Anonymous & Paranoid
|
Si, la comparación por si hay un error en caso de que no sea el eof. Aquí esta como lo he dejado: bytes = fread(buffer,sizeof(char),size,in); if(!feof(in) && ferror(in) != 0 ) { fprintf(stderr,"fread():\n"); _exit(0); } else{ fwrite(buffer,bytes,1,out); } Muchas gracias por los consejos Littlehorse . Saludos!!
|
|
|
|
|
En línea
|
|
|
|
|
|