0

提供されているファイルシステムディスクを読み取ろうとしています。

だから、私がやりたいのは、ファイルシステムから1044バイトを読み取ることです。私が現在行っていることは次のとおりです。

if (fp  = fopen("filesysFile-full", "r")) {
  fseek(fp, 1044, SEEK_SET);        //Goes to 1024th byte
  int check[sizeof(char)*4];        //creates a buffer array 4 bytes long
  fread(check, 1, 4, fp);           //reads 4 bytes from the file
  printf("%d",check);               //prints 
  int close = fclose(fp);
  if (close == 0) {
    printf("Closed");
  }
}

チェックが出力するはずの値は1です。しかし、ファイルを実行するたびに変化し続ける負の値を取得しています。何が間違っているのかわかりません。私はディスクのバイトを読み取り、それらを印刷するための正しいアプローチを取っていますか?

私が基本的にやりたいのは、ディスクのバイトを読み取り、特定のバイトの値を読み取ることです。これらのバイトは、ディスクの構造/フォーマットを理解するのに役立つフィールドです。

どんな助けでもいただければ幸いです。ありがとうございました。

4

2 に答える 2

1
int check[sizeof(char)*4];    //creates a buffer array 4 bytes long

これは正しくありません。通常はそれぞれ32ビットである4つの整数の配列を作成し、printf( "%d"、check)を実行すると、その配列のアドレスが出力されます。これは、プログラムを実行するたびに変更される可能性があります。私はあなたが欲しいものはこれだと思います:

if (fp  = fopen("filesysFile-full", "r")) {
  fseek(fp, 1044, SEEK_SET);         //Goes to 1024th byte
  int check;                         //creates a buffer array the size of one integer
  fread(&check, 1, sizeof(int), fp); //reads an integer (presumably 1) from the file
  printf("%d",check);                //prints 
  int close = fclose(fp);
  if (close == 0) {
    printf("Closed");
  }
}

整数の配列を宣言する代わりに、1つだけを宣言していることに注意してください。また、fread(check、...)からfread(&check、...)への変更にも注意してください。freadの最初のパラメーターは、データを読み取るバッファーのアドレス(この場合は単一の整数)です。

整数はおそらく32ビット長ですが、これは保証されていないことに注意してください。また、ほとんどのオペレーティングシステムでは、整数は最下位バイトを最初にディスクに格納するため、ディスク上のデータがバイト1044で次のようになっている場合にのみ、1を読み取ります。

0x01 0x00 0x00 0x00

逆の場合、0x00 00 00 01は、16777216(0x01000000)として読み取られます。

複数の整数を読み取りたい場合は、次のように配列を使用できます。

if (fp  = fopen("filesysFile-full", "r")) {
  fseek(fp, 1044, SEEK_SET);         //Goes to 1024th byte
  int check[10];                     //creates a buffer of ten integers
  fread(check, 10, sizeof(int), fp); //reads 10 integers into the array
  for (int i = 0; i < 10; i++)
    printf("%d ", check[i]);         //prints 
  int close = fclose(fp);
  if (close == 0) {
    printf("Closed");
  }
}

この場合、check(括弧なし)は配列へのポインターです。そのため、freadをfread(check、...)に戻しました。

お役に立てれば!

于 2011-05-31T01:27:39.567 に答える
1

この行:

int check[sizeof(char)*4];

4つのintの配列を割り当てます。

したがって、チェックのタイプはint *であるため、次の行になります。

printf("%d",check);

配列のアドレスを出力します。

あなたがすべきことそれはintとしてそれを割り当てます:

int check;

そしてそれに踏み込んでください:

fread(&check, 1, sizeof(int), fp);

(ちなみに、このコードはintが4バイトであることを前提としています。)

于 2011-05-31T01:32:57.023 に答える