1

これが私のコードです:

#include <stdio.h>

int main(void) {

        FILE *fp;
        unsigned int i;
        char bytes[512];
        fp = fopen("myFile","r");
        for(i = 0;i <= 512;i++) {
                fread(&bytes, sizeof(bytes), 1, fp);
                printf("bytes[%d]: %x\n", i, bytes[i]);
        }
}

これが期待される出力です

$ hexdump myFile
0000000 aa55 aa55 0060 0000 0a17 0000 b1a5 a2ea
0000010 0000 0000 614c 7563 616e 0000 0000 0000
0000020 0000 0000 0a68 0000 1001 421e 0000 0000
0000030 f6a0 487d ffff ffff 0040 0000 002f 0000

しかし、これが私のプログラムから見たものです

bytes[0]: 55
bytes[1]: 8
bytes[2]: ffffffc8
bytes[3]: ffffffdd
bytes[4]: 22
bytes[5]: ffffffc8
bytes[6]: ffffff91
bytes[7]: 63
bytes[8]: ffffff82

私の明らかな推測は、私が何かを間違ってアドレス指定して間違ったデータを受け取っているか、それを間違って印刷して間違った方法で表示しているということです。

4

4 に答える 4

3

ループを一周するたびにファイルから連続する512バイトのチャンクを読み取り、各チャンクの1バイトのみを出力します。これらの512バイトを一度に読み取り、後で次のように出力することをお勧めします。

fread(&bytes, sizeof(bytes), 1, fp);
for(i = 0;i < 512;i++) {
    printf("bytes[%d]: %x\n", i, bytes[i]);
}

(また、いくつかのエラーチェックは失敗しません。Davが指摘しているように、ファイルから予想されるバイト数を実際に読み取っていることを確認する必要があります。)

于 2010-04-05T22:33:27.197 に答える
3

RichieHindleはすでに問題の大部分を解決しているので、今度は小部分を手伝いたいと思います。

結果を印刷するとき、charsはsに拡張されintます。正の数の場合、これは重要ではありませんが、負の数(> = 0x80)の場合、最初に挿入された一連の符号ビットを取得します。修正は簡単です。

printf("bytes[%d]: %x\n", i, bytes[i] & 0xff); 
于 2010-04-05T22:44:57.383 に答える
1

追記。ループに1つずつずれたエラーがあり、513個の要素を印刷しています。

于 2010-04-05T22:54:40.603 に答える
0

コメントのカップル:

1)512回実行するループでfreadがあり、毎回512バイトを読み取っています。freadをループの外に移動して一度に読み取るか、パラメーター2を変更してfreadをintのサイズに変更します(ループで読み取る場合)。

2)実際に読み取られたバイト数や、ファイルが正常に開かれたかどうかを確認していません。

于 2010-04-05T22:43:28.277 に答える