2013-03-29 10 views
5

私はフリーダの使い方が完全にはわかりません。私はビッグエンディアンに変換する必要のあるリトルエンディアンのバイナリファイルを持っていますが、ファイルの読み方はわかりません。ここで私はこれまで持っているものです。freadはファイルがCで終わったときをどのように知っていますか?

FILE *in_file=fopen(filename, "rb"); 
char buffer[4]; 
while(in_file!=EOF){ 
    fread(buffer, 4, 1, in_file); 
    //convert to big-endian. 
    //write to output file. 
} 

私はまだ何も書かれていないが、私はちょうどいわば、「進歩」へのfreadを取得するかどうかはわかりません。どんな助けもありがとう。

+0

プログラムを完了して実行してください! 'fread'は前回のループの最後の箇所から読み込まれます。 'fread'の戻り値をチェックする必要があります。 'infile'は' EOF'と等しいとは思われません。 –

+4

進歩を遂げるための第一歩は**ドキュメントを読むことです**。 –

+1

"rb"は** R ** ead ** B ** inaryを意味するので、配列はchar型でなくint型でなければなりません。 – MarcusJ

答えて

13

あなたが適切要素正常に読み込まの数を表すsize_tを返しfread C.

内のファイルから読み込む方法はありません。あなたが見ることができるように

FILE* file = fopen(filename, "rb"); 
char buffer[4]; 

if (file) { 
    /* File was opened successfully. */ 

    /* Attempt to read */ 
    while (fread(buffer, 1, 4, file) == 4) { 
     /* byte swap here */ 
    } 

    fclose(file); 
} 

、上記のコードはfreadが4つの要素以外のものを抽出するとすぐに読むのを止めます。

+2

4バイトが確実に読み込まれ、初期化されていない値を使うことの未定義の振る舞いを避けるため、 'while(fread(buffer、1,4、file)== 4){...}'を提案します。 – Sebivor

+0

ありがとうございます。私はちょうど私がサイズのために1とカウントのために4を使用すべきであることに気づいた。また、素晴らしい名前の仲間! –

+0

確かに。私はそれに気付かなかった。私のコメントは、freadが3,2、または1を返す場合、バッファに初期化されていないバイトが存在するため、返された値を0ではなく4に明示的に比較することに関するコメントでした。 – Sebivor

関連する問題