2017-02-12 5 views
-3

私は、freadは非バイナリファイルでは使用されないことを知っています。しかし、私は疑問に思っていた:入力の正確なサイズの関数を提供する場合、なぜそれは正しい値を返すべきではなく、代わりにゴミを返しますか?例としてなぜfreadはバイナリ以外のファイルからゴミを読み込みますか?

FILE *fp; 
int val = 0; 

if(fp = fopen("test.txt", "r")){ 
    fread(&val, sizeof(int), 1, fp); 
    printf("val read %d \n", val); 

    fclose(fp); 

} 

if(fp = fopen("test.txt", "r")){ 
    fscanf(fp, "%d", &val); 
    printf("val read %d \n", val); 

    fclose(fp); 

} 

I内部のみ1234567のファイルを読み取る場合は、出力は、指定抽出物に従って-d指定子でfscanfを使用している

val read 875770417 

val read 1234567 
+1

ごみの意味は?ファイルの内容はどれですか?出力はどれですか? – Lopan

+0

あなたはどんなファイルを読んでいますか、どのようなゴミが出ていますか?質問に最も関連する部分を記入してください(コメントには含まれていません)。 – ForceBru

+0

申し訳ありませんが、間違った質問をしました。私はfreadでfscanfではないことを意味しました。私も例を加えました。 – barry91

答えて

2

- で任意の数の小数点以下(0〜9)、任意に前に符号(+または - )を付けます。

問題は、数字がバイナリファイルの文字列としてではなくバイトとして格納されることです。バイト単位でデータを読み取るには、freadを使用します。こちらをご覧ください: Using fscanf in binary mode

+0

Daveにお返事ありがとうございます。質問を書いている間に私が間違いをしたと信じています。本当ののはfread関数に関連していました。なぜ非バイナリファイルではうまくいかないのか分かりません。 – barry91

+0

@ barry91 - NP。過去にも同様の質問がされました。あなたの質問に答える必要があります。http://stackoverflow.com/questions/11326852/c-fread-binary-number-and-convert-it-to-ascii-code –

1

を、それはあなたが関数fread同様

でそれを読むことができますが、fread(&val, sizeof(int), 1, fp);が正しくないテキストとしてファイル内の1234567を言えば、それは整数は次のように、すなわち、バイナリ表現で書かれたことを前提としint、いないテキストとして、その代わりに、あなたはテキストとしてそれを読む必要があります。

char buf[8]; 
fread(buf,1, sizeof(buf)-1, fp); 
buf[sizeof(buf)-1] = '\0'; 

今はBUF

puts(buf); 
に文字列1234567を持っています
関連する問題