アプリ版:「スタンプのみでお礼する」機能のリリースについて

ファイルをバイナリモードで読み込んで16進数で表示するプログラムについて質問です。

以下の処理内容が理解できません。どのような処理を行っているのでしょうか??

(xdump.c)*********************************
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
int i, j;
FILE *fp;

if(NULL == (fp = fopen(argv[1], "rb"))) {
fprintf(stderr, "Cannot open FILE[%s].\n", argv[1]);
exit(1);
}

for(i=0; i<0x7FFF; ++i) {
printf("%08X :", ftell(fp));

for(j=0; j<16; ++j) {
int c;

c = 0x00FF & getc(fp);
if(ferror(fp)) {
puts("\a>>>> Read Error ! <<<<");
break;
}
if(feof(fp)) break;

/* 16進数で表示 */
printf(" %2X", c);
}
printf(" : %08X\n", ftell(fp)-1);

/* : */
/* : */
/* 以下省略 */
******************************************
上記に関して、
最初のfor文から"c = 0x00FF & getc(fp);"までの処理内容が
よくわかりません。どなたかご教授願えますでしょうか?

A 回答 (4件)

> ftell(fp)


> getc(fp);
標準関数については、関数のリファレンスを参照するとわかるかと思います。

> for(i=0; i<0x7FFF; ++i) {
0xで始まる数値は、16進数表記です。
例えば、16進数での 0x7fff を、10進数に直すと32767 ですね。

なので、
> for(i=0; i<0x7FFF; ++i) {    65535回ループ開始
は誤り、32767回ループと思われます。

> for(i=0; i<0x7FFF; ++i)
はiが0から32767までの間、1つづ加算して、ループすると言う意味ですね。

> c = 0x00FF & getc(fp);
の行ですが、16進数の 0x00ff と、getc(fp)が戻した結果を、&演算子をしようして、
ビットマスクしています。

&演算子 は、論理演算の場合に、論理積(AND)を求める演算子です。
    • good
    • 0

No.1です。



>> for(i=0; i<0x7FFF; ++i) {    65535回ループ開始
>は誤り、32767回ループと思われます。

Yanchさん、訂正ありがとうございます。
0xffffと思い込んでおりました。

masy0312さん、失礼しました。Yanchさんの書き込み通りです。
    • good
    • 0

printf("%08X :", ftell(fp));


fpの位置(ファイル先頭からのバイト数)を16進数8桁で表示しています。
次のforループで16バイトずつ読んでいるので16ずつ増えるはずです。
00000000 :~
00000010 :~
00000020 :~
のように表示されると思います。

c = 0x00FF & getc(fp);
これは無駄な処理のような気がします
getc自体がunsigned charで読み込んでintにキャストするので
c = getc(fp);
でも問題ないはずです。
    • good
    • 0

こんばんは



以下のような説明で判りますでしょうか?

for(i=0; i<0x7FFF; ++i) {    65535回ループ開始
printf("%08X :", ftell(fp));   ファイルポインタの位置を出力
for(j=0; j<16; ++j) {       16回ループ開始
int c;               変数 c の定義
c = 0x00FF & getc(fp);    ファイルから1バイト取得。int c に格納するため、上位8ビットの無効化
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています