• ベストアンサー

【C言語】ファイルを読み込んで16進数で表示する

ファイルをバイナリモードで読み込んで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);"までの処理内容が よくわかりません。どなたかご教授願えますでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Yanch
  • ベストアンサー率50% (114/225)
回答No.3

> 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)を求める演算子です。

その他の回答 (3)

  • garaogu
  • ベストアンサー率40% (67/166)
回答No.4

No.1です。 >> for(i=0; i<0x7FFF; ++i) {    65535回ループ開始 >は誤り、32767回ループと思われます。 Yanchさん、訂正ありがとうございます。 0xffffと思い込んでおりました。 masy0312さん、失礼しました。Yanchさんの書き込み通りです。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

printf("%08X :", ftell(fp)); fpの位置(ファイル先頭からのバイト数)を16進数8桁で表示しています。 次のforループで16バイトずつ読んでいるので16ずつ増えるはずです。 00000000 :~ 00000010 :~ 00000020 :~ のように表示されると思います。 c = 0x00FF & getc(fp); これは無駄な処理のような気がします getc自体がunsigned charで読み込んでintにキャストするので c = getc(fp); でも問題ないはずです。

  • garaogu
  • ベストアンサー率40% (67/166)
回答No.1

こんばんは 以下のような説明で判りますでしょうか? 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ビットの無効化

関連するQ&A

  • C言語 シンプルソート

    C言語始めて1年の初心者です。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 10000 void swapData(char *x, char *y); void simpleSort(char data[], int first, int last); int main(int argc, char *argv[]) { int data[MAXSIZE][300]; int i, j, count; FILE *fp; if(argc != 2) { fprintf(stderr, "Usage: %s <filename>\n", argv[0]); exit(0); } if ((fp = fopen(argv[1], "r")) == NULL) { fprintf(stderr, "File %s is not found.\n", argv[1]); exit(0); } for(i = 0; i < MAXSIZE; i++) { if (fscanf(fp,"%s", &data[i]) == EOF) break; } simpleSort(data[], 0, i - 1); for(j = 0; j < i; j++) printf("%s\n", data[j]); } void swapData(char *x, char *y){ char tmp[300]; strcpy(tmp, x); strcpy(x, y); strcpy(y, tmp); } void simpleSort(char data[], int first, int last) { int i, j; for(i = first; i < last; i++){ for(j = i+1; j <= last; j++){ if(strcmp(&data[i], &data[j]) > 0) swapData(&data[i], &data[j]); } } } 読み込んだ文字データをシンプルソートするプログラムなんですが、コンパイルできません。 simpleSortの部分がおかしいみたいなんですが、見直しても先入観からか間違いを見つけられません・・・・ どなたか間違いを指摘していただけたら助かります。

  • C言語について質問です。

    ソートについて勉強していて、乱数列の要素数Nの値を変えていきバブルソートの交換回数、比較回数を数えるプログラムを作り、後は処理時間について調べたいのですが、処理時間を出力するのはどうやってやるのですか?教えてください。以下に乱数を生成するrand.cとバブルソートを行うbubblesort.cを記載します。これに処理時間を出力するようにしてもらいたいのですが、どうしたらいいですか?解説とソースファイルをよろしくお願いします。 rand.c #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000 int num[N]; int makeDataFile ( void ) { int i; FILE *fp; char s[100]; int num[N]; srand ( ( unsigned )time ( NULL ) ); fp = fopen ("rand1.txt", "w" ); if ( fp == NULL ) exit(1); for ( i = 0; i < N; i++ ){ fprintf ( fp, "%d\n", rand()%100 ); } fclose ( fp ); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) exit(1); while( fgets ( s, sizeof (s), fp ) ) { printf ( s ); } fclose ( fp ); return N; } bubblesort.c #include <stdio.h> #include <time.h> extern int makeDataFile ( void ); extern int num[]; void BubbleSort ( int x[] , int n ); void Show ( int x[] , int n ); int comp; int swap; void BubbleSort ( int x[] , int n ) { int i, j, tmp; for ( i = 0; i < n-1; i++ ) { for ( j = n-1; j > i; j-- ){ comp++; if ( x[i] > x[j] ){ swap++; tmp = x[j]; x[j] = x[i]; x[i]= tmp; Show ( x , n ); } } } } void Show ( int x[] , int n ) { while ( n-- ) printf ( "%d " , *x++ ); printf ( "\n" ); } int main(void) { int i, j, n , tmp; FILE *fp; comp = 0; swap = 0; n = makeDataFile(); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) return 1; for ( i = 0; i < n; i++ ){ fscanf ( fp, "%d", &(num[i] ) ); } fclose ( fp ); printf ( "\nbefore bubblesort\n" ); Show ( num , n ); printf ( "\n" ); printf ( "progress bubblesort\n" ); BubbleSort ( num , n ); printf ( "\n" ); printf ( "after bubblesort\n" ); Show ( num , n ); printf ( "\n" ); printf ( "count of comparisons : %d\n" , comp ); printf ( "count of swap : %d\n" , swap ); return 0; }

  • C言語について質問です。

    ソートについて勉強していて、乱数列の要素数Nの値を変えていきバブルソートの交換回数、比較回数を数えるプログラムを作り、後は処理時間について調べたいのですが、処理時間を出力させることはできたんですが、単位がわかりません。教えてください。 以下に乱数を生成するrand.cとバブルソートを行うbubblesort.cを記載します。 rand.c #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000 int num[N]; int makeDataFile ( void ) { int i; FILE *fp; char s[100]; int num[N]; srand ( ( unsigned )time ( NULL ) ); fp = fopen ("rand1.txt", "w" ); if ( fp == NULL ) exit(1); for ( i = 0; i < N; i++ ){ fprintf ( fp, "%d\n", rand()%100 ); } fclose ( fp ); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) exit(1); while( fgets ( s, sizeof (s), fp ) ) { printf ( s ); } fclose ( fp ); return N; } bubblesort.c #include <stdio.h> #include <time.h> extern int makeDataFile ( void ); extern int num[]; void BubbleSort ( int x[] , int n ); void Show ( int x[] , int n ); int comp; int swap; void BubbleSort ( int x[] , int n ) { int i, j, tmp; for ( i = 0; i < n-1; i++ ) { for ( j = n-1; j > i; j-- ){ comp++; if ( x[i] > x[j] ){ swap++; tmp = x[j]; x[j] = x[i]; x[i]= tmp; Show ( x , n ); } } } } void Show ( int x[] , int n ) { while ( n-- ) printf ( "%d " , *x++ ); printf ( "\n" ); } int main(void) { int i, j, n , tmp; FILE *fp; comp = 0; swap = 0; n = makeDataFile(); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) return 1; for ( i = 0; i < n; i++ ){ fscanf ( fp, "%d", &(num[i] ) ); } fclose ( fp ); printf ( "\nbefore bubblesort\n" ); Show ( num , n ); printf ( "\n" ); printf ( "progress bubblesort\n" ); BubbleSort ( num , n ); printf ( "\n" ); printf ( "after bubblesort\n" ); Show ( num , n ); printf ( "\n" ); printf ( "count of comparisons : %d\n" , comp ); printf ( "count of swap : %d\n" , swap ); return 0; } 実行結果: (ソートは省略) count of comparisons : 499500 count of swap : 14848 2.950000 と出力されたのですが読み方?単位が分かりません。教えてください。2分ぐらいかかった気がします。

  • c言語

    c言語で写真の課題を出されたのですが自分のプログラムでは上手くいきません。どこが間違っているのか教えて欲しいです。 自分のプログラム #include<stdio.h> #include<math.h> int main(){ int i,j; double c,d,x,y,z; for(i=0;i<=360;i++){ c=10*cos(i*M_PI/180); d=10*sin(i*M_PI/180); if(c>=0 && d>=0){ for(j=0;j<=1000;j++){ x=0.001*j; y =x*d/c; z=1-x*x-(sqrt(x)+y)*(sqrt(x)+y); if(z<=0.0){break;} } } if(c<=0 && d>=0){ for(j=0;j<=1000;j++){ x=-0.001*j; y=x*d/c; z=1-x*x-(sqrt(-x)+y)*(sqrt(-x)+y); if(z<=0.0){break;} } } if(c<=0 && d<=0){ for(j=0;j<=1000;j++){ x=-0.001*j; y=x*d/c; z=1-x*x-(sqrt(-x)+y)*(sqrt(-x)+y); if(z<=0.0){break;} } } if(c>=0 && d<=0){ for(j=0;j<=1000;j++){ x=0.001*j; y=x*d/c; z=1-x*x-(sqrt(x)+y)*(sqrt(x)+y); if(z<=0.0){break;} } } printf("x=%lf y=%lf z=%lf\n",x,y,z); } return(0); }

  • C言語 探索に関して

    C言語探索プログラムについて質問です。 #include <stdio.h> #define MAXSIZE 100 void swapData(int *x, int *y){ int tmp; tmp = *x; *x = *y; *y = tmp; } void simpleSort(int data[], int first, int last) { int i, j; for(i = first; i < last; i++){ for(j = i+1; j <= last; j++){ if(data[i] > data[j]) { swapData(&data[i], &data[j]); } } } } int ArrayBinarySearch(int data[], int n, int x) { int left = 0, right = n - 1, center; while(left <= right){ center = (left + right)/2; if(data[center]=x){ return center; }else if(x > data[center]){ left = center + 1; }else if(x < data[center]){ right = center - 1; } } return -1; } int main(int argc, char *argv[]) { int data[MAXSIZE]; int i, x; FILE *fp; scanf("%d", &x); fp = fopen(argv[1], "r"); for(i = 0; i < MAXSIZE; i++) { if (fscanf(fp,"%d", &data[i]) == EOF) break; } simpleSort(data, 0, i-1); printf("%d", ArrayBinarySearch(data, i, x )); return 0; } 数値が書かれたファイルを読み込んでソートした後に二分探索を行うプログラムをつくったのですが、うまく動きません。 どこがおかしいか教えてください。 お願いいたします。 ちなみに関数ArrayBinarySearchは目的の値が見つかれば配列中でのインデックスを、見つからない場合は-1を返す関数にしているつもりです。

  • C言語について質問です。

    前に質問した訂正です。前の質問に関しては質問の意図が伝わりにくい文章で本当に申し訳ないと思っています。 乱数列の要素数Nの値を変えていきバブルソートの交換回数、比較回数を数えるプログラムを作り、後は処理時間について調べたいのですが、処理時間を出力させることはできたんですが、単位がわかりません。教えてください。 以下に乱数を生成するrand.cとバブルソートを行うbubblesort.cを記載します。 rand.c #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000 int num[N]; int makeDataFile ( void ) { int i; FILE *fp; char s[100]; int num[N]; srand ( ( unsigned )time ( NULL ) ); fp = fopen ("rand1.txt", "w" ); if ( fp == NULL ) exit(1); for ( i = 0; i < N; i++ ){ fprintf ( fp, "%d\n", rand()%100 ); } fclose ( fp ); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) exit(1); while( fgets ( s, sizeof (s), fp ) ) { printf ( s ); } fclose ( fp ); return N; } bubblesort.c #include <stdio.h> #include <time.h> extern int makeDataFile ( void ); extern int num[]; void BubbleSort ( int x[] , int n ); void Show ( int x[] , int n ); int comp; int swap; void BubbleSort ( int x[] , int n ) { int i, j, tmp; for ( i = 0; i < n-1; i++ ) { for ( j = n-1; j > i; j-- ){ comp++; if ( x[i] > x[j] ){ swap++; tmp = x[j]; x[j] = x[i]; x[i]= tmp; Show ( x , n ); } } } } void Show ( int x[] , int n ) { while ( n-- ) printf ( "%d " , *x++ ); printf ( "\n" ); } int main(void) { int i, j, n , tmp; FILE *fp; comp = 0; swap = 0; n = makeDataFile(); clock_t start , finish; double duration; start = clock(); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) return 1; for ( i = 0; i < n; i++ ){ fscanf ( fp, "%d", &(num[i] ) ); } fclose ( fp ); printf ( "\nbefore bubblesort\n" ); Show ( num , n ); printf ( "\n" ); printf ( "progress bubblesort\n" ); BubbleSort ( num , n ); printf ( "\n" ); printf ( "after bubblesort\n" ); Show ( num , n ); printf ( "\n" ); finish = clock(); duration = (double)(finish-start) / CLOCKS_PER_SEC; printf ( "count of comparisons : %d\n" , comp ); printf ( "count of swap : %d\n" , swap ); printf ( "%lf\n" , duration ); return 0; } 実行結果: >gcc rand.c bubblesort.c (ソートは省略) count of comparisons : 499500 count of swap : 14848 2.950000 と出力されたのですが読み方?単位が分かりません。教えてください。自分の答えとしては2分55秒だと思うんですが合ってますか?連続質問ですいません。

  • C言語でファイルから複素数の値を読み込んで表示させるプログラムを作って

    C言語でファイルから複素数の値を読み込んで表示させるプログラムを作っています。 扱う値が実数のみの場合に関しては問題ないのですが、 複素数を読み込む時には、実数のみの場合や、虚数のみの場合もあり、 どう読み込んでいいか分からず、アドバイスを戴きたいと考えております。 それ以外のデータの取り扱い自体は問題ないと思います。 下は実数の値を読み込むプログラムとデータセット、 それを拡張した複素数の値を読み込むプログラムとデータセットになっております。 アドバイス、よろしくお願いいたします。 -------------------------------------------------------------------------------- /*データセット sample.dat*/ 4 3.5 -2 9 12 37.8 65.4 0.4 79.5 3 23.4 5.3 -------------------------------------------------------------------------------- /*プログラム本体 read.c*/ #include <stdio.h> #include <stdlib.h> #define LOW 3 #define COLUMN 4 int main(void){ int i,j; double x[LOW][COLUMN]; if((fp = fopen("sample.dat","r"))==NULL){ printf("The file is not found. : sample.dat \n"); exit(1); } for(i=0;i<LOW;i++){ for(j=0;j<COLUMN;j++){ fscanf(fp,"%lf",&x[i][j]); } } for(i=0;i<LOW;i++){ for(j=0;j<COLUMN;j++){ printf("%lf\n",x[i][j]); } } return 0; } -------------------------------------------------------------------------------- /*データセット sample_C.dat*/ 4+i i -2 9+i 12 37.8-i 65.4i 0.4+i 79.5 3+i 23.4 5.3 -------------------------------------------------------------------------------- /*プログラム本体 read_C.c*/ #include <stdio.h> #include <stdlib.h> #define LOW 3 #define COLUMN 4 typedef struct{ double re; double im; }C_double; int main(void){ int i,j; C_double x[LOW][COLUMN]; if((fp = fopen("sample_C.dat","r"))==NULL){ printf("The file is not found. : sample_C.dat \n"); exit(1); } /*改良したい読み込み部分*/ for(i=0;i<LOW;i++){ for(j=0;j<COLUMN;j++){ fscanf(fp,"%lf",&x[i][j].re); fscanf(fp,"%lf",&x[i][j].im); } } for(i=0;i<LOW;i++){ for(j=0;j<COLUMN;j++){ if(x[i][j].re!=0){ if(x[i][j].im!=0){ printf("x[%d][%d]=%lf+%lfi\n",i,j,x[i][j].re,x[i][j].im); } else{ printf("x[%d][%d]=%lf\n",i,j,x[i][j].re); } } else{ if(x[i][j].im!=0){ printf("x[%d][%d]=%lfi\n",i,j,x[i][j].im); } else{ printf("x[%d][%d]=0\n",i,j); } } } } return 0; }

  • C言語 エラー表示 break の位置が誤っている(関数 main ) 

    #include<stdio.h> int main(void){ int n,i,j,k; char c='*'; printf("正の整数:"); scanf("%d",&n); if(n>0){ for(i=1;i<=n;i++){ printf("%d",i); for(j=1;j<=n+1-i;j++){ if(j==1){ if(i-1>0){ for(k=i-1;k>0;k--){ printf(" "); } } } printf("%c",c); } printf("\n"); } } break; return 0; } これをコンパイルすると「break の位置が誤っている(関数 main )」と表示されるのですが何でですか? 困ってます↓

  • C言語 教えて下さい!!!

    教えてください!! data01.txt というテストの得点が書き込んであるテキストファイルから得点を読み込んで、得点順に並べ替えて表示させるプログラミングなんですがコンパイルは成功します。 しかし、実行してみると全く違う結果になってしまいます。 どこが間違っているのか指摘してください。 #include <stdio.h> /* 構造体の宣言 */ struct data { int score; int rank; }d; /* 関数 */ void rank(struct data *x, int n) { int i, j; for ( i=0; i<n; i++) x[i].rank = 1; for ( i=0; i<n; i++) for ( j=0; j<n; j++) if(x[i].score < x[j].score) x[i].rank++; } /* main文 */ int main(void) { int a; struct data x[50]; /* ファイルから得点を読み込む */ FILE *fp; fp = fopen("data01.txt", "r"); for ( a=0; a<50; a++) x[a] = atoi(getc(fp); fclose(fp); /* 順位付け */ a = 50; rank(x,a); printf("Rank Score\n"); for ( a=0; a<50; a++) printf("%d %d\n", x[a].rank, x[a].score); return 0; } ちなみに data.txt は 左側の列は番号 右側の列が得点 1 50 2 62 3 73 4 42 5 99 6 10 7 68 8 54 9 87 10 98 11 54 12 30 13 15 14 60 15 78 16 98 17 65 18 75 19 32 20 99 21 80 22 64 23 52 24 31 25 99 26 10 27 20 28 5 29 65 30 53 31 54 32 35 33 45 34 23 35 26 36 97 37 88 38 99 39 56 40 42 41 32 42 56 43 56 44 54 45 0 46 54 47 80 48 99 49 54 50 56

  • C言語 素数判定

    1000以下の素数を求めるプログラム kadai7-2.c を作成せよ。各素数を整数4桁で出力し、15個の素数を出力した時点で改行処理 を行うこと。作成したプログラムを提出せよ。 という問題なのですが、以下のプログラムを実行しても動きませんでした。どこが違うのでしょうか。ご指摘お願いします。 #include<stdio.h> #include<math.h> main(){ int i,j,ix,k,h; for (i=2;i<=1000;i++){ ix=(int)(sqrt((double)i)); k=0; for(j=2;j<=ix;j++){ if(i%j==0){ k=1; } } if(k==0){ printf("%4d",i); h+=1 if(h=15){ printf("\n"); h=0; } }

専門家に質問してみよう