2012-02-07 15 views
14

私のプロジェクトでは、センサーデータがshort(16 bit values)という形の.binファイルを読みました。私はバッファにfreadの機能を使ってこれをやっていますが、読み込みが正しく行われていないと感じています。私はを書いているものと私が読んだものとの間に一貫性がないことを意味します。あなたはここで間違っていることを提案できますか?これは私のプロジェクトのコードではありません。ここではfreadfwriteの機能を確認しようとしています。fread関数とfwrite関数を使用してバイナリファイルを読み書きする方法はありますか?

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

私は関数fread()(HEX値)を実行した後:

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

を私はfwriteの操作を行うと()

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

あなたがクローズし、ファイルを再オープンしようとしたことがありますか?ファイルに書き込んですぐに読み込むと、ファイルの内容が何であるか分かりません。最初にデータを閉じて、データがフラッシュされるようにする必要がありますか?また、2回目の読み取りのためにそれを開くようにしてください。 – aardvarkk

答えて

12

モードw+(読み取りと書き込み)でファイルを開きます。次のコードは動作します:

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

出力で:

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

@ RichardJ.RossIII私の答えにはいくつかの訂正がありました。 – trojanfoe

3

ファイルを開いたときに、あなたができるようにするのを忘れて読む:

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

する必要があります:

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

モード 'rwb'は認識されません。私はあなたが 'w + b'または' wb + 'を意味すると思います。 – pmg

+0

@pmg 'rwb'はMac OSX Lionのgccでうまく動作します。 –

+2

よく@リチャード:それにもかかわらず、標準ではありません。 [ここをクリック](http://port70.net/~nsz/c/c99/n1256.html#7.19.5.3)または[このPDF](http://www.open-std.org/JTC1/sc22) /wg14/www/docs/n1256.pdf)。 – pmg

関連する問題