2012-02-07 11 views
14

Salve nel mio progetto, devo leggere un file .bin che ha i dati del sensore sotto forma di short(16 bit values). Lo sto facendo usando la funzione fread in un buffer, ma ritengo che la lettura non stia avvenendo correttamente. Intendo lo non c'è coerenza tra ciò che scrivo e ciò che leggo. Potete suggerire cosa sta succedendo qui? Questo non è il mio codice dal mio progetto ... Sto solo provando a verificare le funzioni fread e fwrite qui.Come utilizzare le funzioni fread e fwrite per leggere e scrivere file binari?

#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) 
} 

Dopo faccio la fread() (valori HEX):

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

Dopo faccio la fwrite()

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

Hai provato chiudere e quindi riaprire il file? Non sono sicuro di cosa sia il contenuto di un file se ci scrivi e ti leggo subito. Potrebbe essere necessario chiuderlo per assicurarsi che i dati vengano scaricati? Inoltre, assicurati di aprirlo per la lettura la seconda volta ... – aardvarkk

risposta

12

Aprire il file con la modalità w+ (lettura e scrittura). Il seguente codice funziona:

#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 uscita:

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

@ RichardJ.RossIII Nella mia risposta sono state apportate numerose correzioni. – trojanfoe

3

Quando si apre il file, si è dimenticato di consentire per la lettura:

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

Dovrebbe essere:

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

La modalità 'rwb' non è riconosciuta. Penso che tu intenda "w + b" o "wb +". – pmg

+0

@pmg 'rwb' funziona bene per me, gcc su Mac OSX Lion. –

+2

Bene @Richard: non è tuttavia Standard. [vedi qui] (http://port70.net/~nsz/c/c99/n1256.html#7.19.5.3) o [in questo PDF] (http://www.open-std.org/JTC1/sc22 /wg14/www/docs/n1256.pdf). – pmg

Problemi correlati