2017-06-26 8 views
0

基本的に私は数値を含むテキストファイルを持っています。私は数を0に変更して開始し、ファイルから2バイトを読み込みます(intは2バイトなので)、intに変換しました。結果を印刷しますが、奇妙な結果が表示されます。ファイルから2バイトを読み込んでintに変換すると、間違った出力が返されます

私は0を持っているので何らかの理由で2608を出力します。

私は、0から1までのオフセットが数字を表すファイルを読み込む必要があると書かれています。だから、私は文字の代わりにバイトを読み込んでいるのです...

私はこの問題が文字で読むのではなくバイトを読み込むことによるものだと考えています。 ?私は本当にわからないんだけど

void readFile(FILE *file) { 
    char buf[2]; 
    int numRecords; 

    fread(buf, 1, 2, file); 

    numRecords = buf[0] | buf[1] << 8; 

    printf("numRecords = %d\n", numRecords); 
} 

何BUF [0] |:ここ

は私のコードですbuf [1] < < 8ですが、私は別の質問からそれを得ました...だから、それも問題であると思います。

+1

となります。テキストファイルを持っているか、2バイトのバイナリ整数を持つファイルがあります。同時に両方ではありません。 – EJP

+0

@EJP私は完全に空白で、私のintがASCII形式であることを忘れてしまった。 – Logan

答えて

3

テキストファイル内の数字0は、実際には1バイトの16進数0x30として表されます。 0x30buf[0]にロードされています。あなたがbuf[1]にごみデータが

ASCIIテーブルにおいて、00x30で表される)、この場合、値が0x0aあります。小数で2608ある0x0a30にこれら二つbuf[0] | buf[1] << 8による結果を組み合わせる

0x0aは、ASCIIテーブルに\nあります)。 <<はビット単位の左シフト演算子であることに注意してください。

(また、int型のサイズは多くのシステムでは4バイトである。あなたはそれをチェックアウトする必要があります。)

+0

あなたの素早い返答をありがとう。何らかの理由でintからファイルに実際のバイトを書き込んでプログラムをテストできる別の方法はありますか? – Logan

+0

'fprintf(ファイル、"%d "、numRecords)'を試してください。これは 'int'を対応するテキストに変換します。実際のバイトを書きたい場合は、 'fwrite'を実行することができます。 – nglee

+0

私はfprintf(ファイル "%d"、numRecords)を使って試してみましたが、出力にコードを走らせましたが、現在は48が出力されています...これはreadFile()の問題ですか? – Logan

0

あなたが直接あなたが上sizeof(int)をチェックする必要が整数に

fread(&numRecords, sizeof(numRecords), 1, file); 

を読むことができますあなたのシステムでは、その4バイトがではなくnumRecordsと宣言する必要がある場合は

関連する問題