0

今週の課題は、教授から送られてきたデータ ファイルを読み取るプログラムを作成することです。割り当ては、このデータには配列に書き込む必要がある10個の整数があることを示しています。これは実行しましたが、それが正しいのか、それとも単なるジャンクデータなのかわかりません。このファイルの DL リンクを添付します (わずか 40 バイトです)。必要な 10 個の数字を読み取るプログラムを以下に作成しましたが、それがジャンク データか本物かをどのように判断すればよいでしょうか。毎回同じ数値を取得していますが、それは私がこれを正しく行っていることを示していますか? 将来的に使用するための長期的なヒントもいただければ幸いです。

DLリンクは こちら

#include <stdio.h>
#include <string.h>

int main(void)
{
  int i;

  FILE* myFile = NULL;

  myFile = fopen("mysteryData.dat", "rb");

  int Mystery[10] =
  { '\0' };

  if (myFile == NULL )
  {
    printf("Failed to open file\n");
  }
  else
  {
    fread(Mystery, sizeof(int), sizeof(Mystery), myFile);

    printf("%d\n", Mystery);
  }

  for (i = 0; i < 9; i++)
  {
    printf("%d\n", Mystery[i]);
  }
  fclose(myFile);
}
4

2 に答える 2

0

まず、通話Mystery後にのアドレスを出力する場合は、 を使用する必要があります。次に、おそらく 16 進数で印刷すると、問題を確認するのに役立ちます。fread%p

% echo $'\x12\x34\x56\x78\x9a\xbc\xde\xff' > mysteryData.dat
% ./test
0x7fff598cfae0 # %p
78563412       # %x
ffdebc9a
a # newline = 0x0a
0
0
0
0
0
0
%

値は整数にまとめられており、バイト単位で反転されています。整数として読み取っているため、それらは一緒につなぎ合わされています。

12 34 56 78 9a bc de ff a0 00 00 00
^---------^ ^---------^ ^---------^

このことからint、私のコンパイラの s は 32 ビット (4 バイト) であることがわかります。さらに、バイトがスワップされる理由は、私のシステムがリトルエンディアンであるためです。つまり、12が最下位の 8 ビットで34あり、次に最上位であるなどです。

おそらく、これらに個別のバイトとしてアクセスする必要があるため、 に変更Mysteryする必要がありますchar[10]。また、十分なスペースを確保するためにサイズを大きくすることもできます。fread最後に、実際に読み取ったバイト数を示すの戻り値を確認します。


Freadは次のように宣言されます。

fread(void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);
                                 ^^^^         ^^^^^^

右を渡していますがsize、アイテムの数を渡す代わりにnitems、のサイズMystery、つまり を渡していnitems*sizeof(int)ます。使用する

fread(Mystery, sizeof(int), sizeof(Mystery)/sizeof(int), myFile);

またはより良い、

fread(Mystery, sizeof(Mystery[0]), sizeof(Mystery)/sizeof(Mystery[0]), myFile);
于 2013-10-25T14:38:35.703 に答える