2012-02-07 4 views
14

Witam w moim projekcie Muszę przeczytać plik .bin, który ma dane z czujników w postaci short(16 bit values). Robię to za pomocą funkcji fread w buforze, ale uważam, że odczyt nie odbywa się poprawnie. Mam na myśli nie ma żadnej zgodności między tym, co piszę, a tym, co czytam. Czy możecie sugerować, co tu jest nie tak? To nie jest mój kod z mojego projektu ... Próbuję tylko sprawdzić funkcje fread i fwrite tutaj.Jak używać funkcji Fread i Fwrite do odczytywania i zapisywania plików binarnych?

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

Po robię fread() (Hex Values)

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

Po robię fwrite()

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

Czy próbowałeś zamykania i ponownego otwierania pliku? Nie jestem pewien, jaka jest zawartość pliku, jeśli napiszesz do niego, a następnie natychmiast go odczytasz. Może być konieczne zamknięcie go najpierw, aby upewnić się, że dane zostały przepłukane? Ponadto upewnij się, że otworzysz go do odczytu po raz drugi ... – aardvarkk

Odpowiedz

12

Otwórz plik z trybu w+ (czytanie i pisanie). Poniższy kod działa:

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

Z wyjściem:

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

@ RichardJ.RossIII W mojej odpowiedzi było kilka poprawek. – trojanfoe

3

Po otwarciu pliku, zapomniałeś, aby umożliwić do czytania:

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

Powinno być:

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

Tryb 'rwb' nie jest rozpoznawany. Myślę, że masz na myśli 'w + b' lub' wb + '. – pmg

+0

@pmg 'rwb' działa dobrze dla mnie, gcc na Mac OSX Lion. –

+2

Dobrze @ Ricich: nie jest to jednak Standard. [patrz tutaj] (http://port70.net/~nsz/c/c99/n1256.html#7.19.5.3) lub [w tym pliku PDF] (http://www.open-std.org/JTC1/sc22 /wg14/www/docs/n1256.pdf). – pmg

Powiązane problemy