2017-01-27 3 views
0

私は次のように、Cの画像ファイルのバイトを読み取るために、具体的PNGをしようとしています:なぜfgetcはCのあるPNGのバイトだけを読み込みますか?

#include <stdio.h> 

int main(){ 
    FILE* fd = fopen("logo.png", "r"); 
    char c = fgetc(fd); 
    while(c != EOF){ 
    printf("%c", c); 
    c = fgetc(fd); 
    } 
    return 0; 
} 

私はプログラムを実行すると、私は彼には、以下の取得:

<89>PNG^M 
^Z 
^@^@^@^MIHDR^@^@^@ 

なぜ特定のバイトに行き、その後ファイルを完全に終了するのですか?この問題をどうやって解決しますか?

+0

また 'ロゴ」(はfopen .png "、" r ");' - > 'fopen(" logo.png "、" rb ");'バイナリモードで開きます。 – chux

+0

rに比べてrbを使うほうがよいでしょうか?用途の違いを理解したいだけです。 – user3864563

+1

一部のシステムでは、_text_モードのファイルで変換を実行します。 '\ r \ n 'のように(' 'b" 'はありません)<==>' \ r'です。 .pngファイルはバイナリファイルです( '' b "'を追加します)。翻訳は必要ありません。 – chux

答えて

3

コードにエラーがあります。

// Wrong 
char c = fgetc(fd); 

正しいバージョンは次のとおりです。何が起こっている

// Correct 
int c = fgetc(fd); 

はバイト0xffはどこかPNGファイルに表示されています。だから、あなたが得る:

char c = 0xff; 

しかし、それはオーバーフローだし、この場合には、もたらすことが起こる:

char c = -1; 

そしてEOFもある-1。

(あなたがCの標準を読めば、それは、私たちが実際に未定義の動作が発生したことが判明しが、未定義の動作の議論はウサギの穴に回すことができることに注意してください。)

+1

私は最後のコメントが好きです:D – P0W

+0

ありがとう!これにより私のプログラムにあったバグが修正されました。私のコードが執着していたキャラクターは\ 377でした。私はキャラクターが問題を抱えていることを知っていましたが、何が起こっていたのか私を混乱させていました。 – user3864563

関連する問題