2

次のような内容のテキスト ファイルがあります。

12345678901222344567

次に、このコードを使用してコンテンツを読み取りました。

FILE * pFile;
  int c;
  char buffer [256];
  pFile = fopen ("myfile.txt","r");
  int a[50] = {0};
  fread(a, sizeof(a[0]), 5, pFile);
  fclose(pFile);
  for (c = 0; c < 5; c++)
  {
    printf("%d\n", a[c]);
  }

そして私は結果を得ました:

ここに画像の説明を入力

なぜこのような結果になったのか、自分でも説明できません。

4

3 に答える 3

5

テキスト ファイルがありますが、 fread はバイナリ データを読み取ります。したがって、ファイルのテキストではなく、ファイルのバイトを保存しています。代わりにfread を使用して未使用のbuffer変数に値を入力してみてください。テキスト文字列を取得できるはずです。これは、sscanf() などを使用して解析できます。または、fread の使用をやめて、代わりに fscanf を使用することもできます。

于 2012-04-21T13:40:15.553 に答える
5

それが正しい結果です。テキストや整数ではなく、バイナリ データとしてデータを読み取っています。最初の 4 バイトは 0x31323334 で、Intel マシンで読み取ると、10 進数で 875770417 である 0x34333231 に反転します。

于 2012-04-21T13:40:27.100 に答える
4

テキストファイルとバイナリファイル

freadバイナリファイルで使用されるはずのテキストファイルで関数を誤用します。テキスト ファイルは、バイナリ ファイルとは異なります。

たとえば、txt を 4 つのASCII 文字 "1", "2", "3",で保存した場合"4"、実際にディスクに保存されるのは1, 2,3ではありません4。代わりに、それは ACSII コードです: 49, 50, 51, 52. したがって、sizeof(a[0])バイトをに読み込むと、次a[0]のように 4 バイトがメモリに読み込まれます。

Memory Address    Byte In Memory        Little-endian
  0x12345678        00110001     <----least significant byte
  0x12345679        00110010
  0x12345680        00110011
  0x12345681        00110100     <----most significant byte

(アドレスは説明のために偽造されていることに注意してください)

エンディアンネス

これらの 4 バイトを整数に変換する方法については、すべてエンディアンと関係があります。つまり、プラットフォームがリトル エンディアン (Intel x86 プロセッサなど) の場合、00110001最下位メモリ アドレス ( 0x12345678) の最初のバイト ( ) が整数を形成する最下位バイトになります。

最終的に、整数は001101000011001100110010001100012 進数、つまり87577041710 進数になります。

于 2012-04-21T14:08:06.040 に答える