2016-05-31 28 views
1

私は実行可能ファイルre.exeを持っています。バイナリ形式でその内容を読み込み、その内容をコンソールに表示します。次のコードを記述しますが、コンソールにバイナリファイルの内容は表示されません。どうしたの?バイナリモードでファイルを読み込み、Cで

#include <stdio.h> 
#include <ctype.h> 

void readFile(const char *fileName) { 
    FILE *file; 
    file = fopen(fileName, "rb"); 
    if (file != NULL) { 
     char ch; 
     while ((ch = fgetc(file)) != EOF) { 
      if (isprint(ch)) { 
       printf("%x", ch); 
      } 
      else { 
       printf("%02x", ch); 
       if (ch == '\n') { 
        fputs("\n", stdout); 
       } 
      } 
     } 
    fclose(file); 
    } 
} 

int main() { 

    readFile("re.exe"); 

    return 0x0; 
} 
+1

プログラムを実行した後、コンソールには何が表示されますか? 'fopen'は失敗せず、' NULL'を返しますか? – s7amuser

+0

あなたのプログラムはそれ自身を読み込もうとしていますか? – purplepsycho

+0

@purplepsychoいいえ、それはre.exeを読むつもりです。 – user3646905

答えて

2

問題がintからcharfgetcの戻り値の暗黙的キャストです。 EOFので

(少なくともglibcに)(-1)として定義され、返さcharは(GCCログインデフォルトである)C99 standardのセクション6.3.1.8に指定されている(符号拡張付き)intに変換されます。

両方のオペランドの型が同じ場合、それ以上変換する必要はありません。

両方のオペランドが符号付き整数型を持つ場合、または両方とも符号付き 整数型がある場合、より小さい整数変換ランクの型を持つオペランドは、より大きなランクを持つオペランド型に変換されます。

結果、文字0xff0xffffffffに変換され、ループはすべてのファイルを読み込む前に時期尚早に終了させるEOFの値に実際に等しいです。 printf("%x", ch)またはprintf("%02x", ch)で文字を印刷する際に加えて

は、文字が再び(hereを参照)intに変換され、したがって、あなたは、例えば、文字0x90ための出力0xffffff90を見ることができます。要約すると、この解決策は、charの代わりにintであると定義しています(ch)。

関連する問題