2012-02-07 13 views
14

Merhaba, projemde short(16 bit values) biçiminde sensör verisi olan bir .bin dosyası okudum. Bunu bir arabelleğe fread işlevini kullanarak yapıyorum, ancak okuma girişinin doğru olmayacağını hissediyorum. demek istediğim, yazdıklarım ile okuduğum arasında bir tutarlılık yok. Burada neyin yanlış gittiğini önerebiliyor musunuz? Bu benim projemdeki kodum değil ... Sadece fread ve fwrite işlevlerini burada doğrulamaya çalışıyorum.İkili dosyaları okumak ve yazmak için fread ve fwrite işlevleri nasıl kullanılır?

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

ben fread() (HEX değerleri) yaptıktan sonra:

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

Ben

dosyayı açtı
stdout: 
Result 
0 
914 
-28 
-28714 
-32557 
1 
512 
-32557 
908 
914 
+0

dosyayı yeniden açmayı sonra kapanış ve denediniz mi? Bir dosyanın içeriğinin ne yazdığına emin değilim ve hemen okudum. Verilerin temizlendiğinden emin olmak için önce kapatmak zorunda kalabilirsiniz? Ayrıca, etrafında ikinci kez okumak için açtığınızdan emin olun ... – aardvarkk

cevap

12

Dosyayı w+ (okuma ve yazma) modunda açın. çıkışı ile

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

: Aşağıdaki kod çalışır

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

@ RichardJ.RossIII Cevabımda yapılan bazı düzeltmeler yapıldı. – trojanfoe

3

, sen izin unuttum fwrite() yaptıktan sonra okumak için:

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

Olması gerekenler:

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

"rwb" modu tanınmadı. Bence w + b' veya wb + 'demek istiyorsun. – pmg

+0

@pmg 'rwb' benim için iyi çalışıyor, Mac OSX Lion'da gcc. –

+2

Well @Richard: Yine de Standart değil. [bkz.] (http://port70.net/~nsz/c/c99/n1256.html#7.19.5.3) veya [bu PDF’de] (http://www.open-std.org/JTC1/sc22 /wg14/www/docs/n1256.pdf). – pmg

İlgili konular