2012-02-07 22 views
14

Hola en mi proyecto, tengo que leer un archivo .bin que tiene datos de sensor en forma de short(16 bit values). Lo hago utilizando la función fread en un búfer, pero creo que la lectura no está ocurriendo correctamente. Me refiero a no hay consistencia entre lo que escribo y lo que leo. ¿Pueden sugerirnos qué está pasando mal aquí? Este no es mi código de mi proyecto ... Solo estoy intentando verificar las funciones fread y fwrite aquí.¿Cómo usar las funciones fread y fwrite para leer y escribir archivos binarios?

#include<stdio.h> 
void main() 
{ 
    FILE *fp = NULL; 

    short x[10] = {1,2,3,4,5,6,5000,6,-10,11}; 
    short result[10]; 

    fp=fopen("c:\\temp.bin", "wb"); 

    if(fp != NULL) 
    { 
     fwrite(x, 2 /*sizeof(short)*/, 10 /*20/2*/, fp); 
     rewind(fp); 
     fread(result, 2 /*sizeof(short)*/, 10 /*20/2*/, fp); 
    } 
    else 
     exit(0); 

    printf("\nResult"); 
    printf("\n%d",result[0]); 
    printf("\n%d",result[1]); 
    printf("\n%d",result[2]); 
    printf("\n%d",result[3]); 
    printf("\n%d",result[4]); 
    printf("\n%d",result[5]); 
    printf("\n%d",result[6]); 
    printf("\n%d",result[7]); 
    printf("\n%d",result[8]); 
    printf("\n%d",result[9]); 

    fclose(fp) 
} 

Después de hacer la fread() (valores HEX):

temp.bin: 
01 02 03 04 05 06 e1 8e 88 06 ef bf b6 0b... 

Después de hacer la fwrite()

stdout: 
Result 
0 
914 
-28 
-28714 
-32557 
1 
512 
-32557 
908 
914 
+0

¿Ha intentado cerrar y volver a abrir el archivo? No estoy seguro de cuál es el contenido de un archivo si escribe en él y luego lo lee de inmediato. Es posible que deba cerrarlo primero para asegurarse de que los datos se eliminen. Además, asegúrese de abrirlo para leer la segunda vez ... – aardvarkk

Respuesta

12

Abra el archivo con el modo w+ (lectura y escritura). El siguiente código funciona:

#include<stdio.h> 
int main() 
{ 
    FILE *fp = NULL; 

    short x[10] = {1,2,3,4,5,6,5000,6,-10,11}; 
    short result[10]; 
    int i; 

    fp=fopen("temp.bin", "w+"); 

    if(fp != NULL) 
    { 
     fwrite(x, sizeof(short), 10 /*20/2*/, fp); 
     rewind(fp); 
     fread(result, sizeof(short), 10 /*20/2*/, fp); 
    } 
    else 
     return 1; 

    printf("Result\n"); 
    for (i = 0; i < 10; i++) 
     printf("%d = %d\n", i, (int)result[i]); 

    fclose(fp); 
    return 0; 
} 

Con salida:

Result 
0 = 1 
1 = 2 
2 = 3 
3 = 4 
4 = 5 
5 = 6 
6 = 5000 
7 = 6 
8 = -10 
9 = 11 
+0

@ RichardJ.RossIII Hubo varias correcciones hechas en mi respuesta. – trojanfoe

3

Al abrir el archivo, se le olvidó para permitir para leer:

fp=fopen("c:\\temp.bin", "wb"); 

Debería ser:

fp=fopen("c:\\temp.bin", "w+b"); 
+2

El modo 'rwb' no se reconoce. Creo que te refieres a 'w + b' o' wb + '. – pmg

+0

@pmg 'rwb' funciona bien para mí, gcc en Mac OSX Lion. –

+2

Bien @Richard: no es estándar, sin embargo. [ver aquí] (http://port70.net/~nsz/c/c99/n1256.html#7.19.5.3) o [en este PDF] (http://www.open-std.org/JTC1/sc22 /wg14/www/docs/n1256.pdf). – pmg

Cuestiones relacionadas