1

私はCにかなり慣れていませんが、freadの問題に遭遇しました...

私の最終目標は、.bin ファイルからバイナリを読み取る (そしてコンソールに printf する) ことですが、今のところ、一度に 1 つずつ実行して、最初のビットだけを読み取ろうとしています...

私のコード:

...
FILE *file = fopen("test1.bin", rb);
int i = 0;
fread(&i, 1, 1, file);
printf("%i\n", i);
...

これを 3 つの異なる .bin ファイルで試してみました。

ファイルから 1 ビットだけを読み込んでいるときに 2/12 を出力するのはなぜですか? 0か1じゃないの?私は何を間違っていますか?どうもありがとう。

4

2 に答える 2

7

fread()呼び出しを次のように変更します。

fread(&i, sizeof(int), 1, file);

2 番目の引数は読み取る要素のサイズ、3 番目の引数は読み取る要素の数です。投稿されたコードは、1 バイトをint.

また、 およびからの戻り値をチェックして、それらが成功したことを確認する必要がfopen()あります。fread()

于 2012-05-31T22:09:32.470 に答える
1

@hmjdが言ったように、int値を埋めるために必要なバイト数を読み取る必要があります。したがって、次のいずれかの方法で:

len = fread(&i, sizeof(int), 1, file);

またはこのように:

len = fread(&i, 1, sizeof(int), file);

int最初のケースは、1つの値(通常は4バイト)を読み取ります。呼び出し後、len読み取りが成功した場合は1に等しくなります。

2番目のケースは、複数のバイトを値に読み込みintます。違いは、この呼び出しの後、lenはに等しくなるはずsizeof(int)です。

どちらの方法でも機能します。唯一の違いは、最初の方法で複数バイトの単一オブジェクト(an int)の読み取りを指定するのに対し、2番目の方法ではオブジェクトに読み取るバイト数を指定することです。それは微妙な違いであり、もちろん人々はどちらが最善かについて意見が分かれます。

2番目の方法の利点は、len実際に読み取られたバイト数を正確に通知できることです(これは、I / Oエラーのデバッグに役立つ場合があります)。最初の方法の利点は、概念的に単純な成功のテストであるということです(1つint読んだかどうか)。

ただし、どのように実行しても、常にの戻り値を確認する必要がありますfread()

于 2012-05-31T22:28:31.583 に答える