基本情報技術者試験の過去問と解説
[TOP] [午前分野別] [午後分野別] [キーワード索引] [令和元年秋午前] [令和元年秋午後]

令和元年 秋期 基本情報技術者 午後 問09
問09   C言語

 次のCプログラムの説明及びプログラムを読んで,設問1,2に答えよ。

 

 入力ファイルの内容を,文字及び 16 進数で表示するプログラムである。

 

〔プログラムの説明〕

(1) 関数 dump の引数の仕様は,次のとおりである。

 char *filename 入力ファイルのファイル名

 long from   表示を開始するバイト位置

 long to    表示を終了するバイト位置(値が負の場合はファイルの末尾 )

 ここで,バイト位置は,ファイルの先頭のバイトから順に 0,1,… と数える。

(2) 入力ファイルは,バイナリファイルとして読み込む。入力ファイル中の各バイトの 内容(ビット構成)に制約はない。図1に,入力ファイルの例を示す。

(3) 入力ファイル中の各バイトの内容を,文字及び 16 進数で表示する。 図2は図 1の入力ファイルの先頭から末尾までの表示例であり, 図3は同じファイルのバイト位置 17 から 40 までの表示例である。

(4) 表示の様式を,次に示す。説明中の@,A,… は,図中の網掛け部分を指している。

  • 入力ファイルのバイト位置 from から 60 バイトずつを,3 行 1 組で表示する。
  • 各組の 1 行目に各バイトが表す文字を,2 行目に各バイトの 16 進数表示の上位桁を, 3 行目に同下位桁を,それぞれ表示する。例えば,@のバイトは,文字表示が “i”で, その 16 進数表示が 69 である。
  • バイトの内容が 16 進数表示で 20 〜 7E 以外の場合は,そのバイトが表す文字として, Aのように“.”を表示する。
  • 各組の 1 行目の行頭に,その組に表示する最初のバイトのバイト位置を 10 進数でBの形式で表示する。
  • 入力ファイルの内容の表示が終わった後,最終行のCの位置には,入力ファイルの終わりに 達して終了した場合は“END OF DATA”を,表示を終了するバイト位置に達して終了した場合は “END OF DUMP”を表示する。Dの位置には,表示した入力ファイルの内容のバイト数を 10 進数で表示する。
(5) 入力ファイルのファイルサイズ(バイト数)及び引数 from,to の値は,次の式を満たすものとする。   to < 0 の場合 : to < 0 ≦ from < ファイルサイズ < 231

  to ≧ 0 の場合 : 0 ≦ from ≦ to < ファイルサイズ < 231

(6) プログラム中で使用している関数 fgetc(s) は,ストリーム s から1文字を読み込んで返す。 ファイルの終わりに達しているときは,EOF を返す。

 

図1 入力ファイルの例

 

図2 図1の入力ファイルの先頭から末尾までの表示例

 

図3 図1の入力ファイルのバイト位置 17 から 40 までの表示例

 

〔プログラム〕
#include <stdio.h>

#define  WIDTH    6Ø     /* 行当たり表示バイト数 */
#define  MASKCHR  '.'    /* 16 進数表示で 2Ø〜7E 以外の場合の表示用文字 */

void dump(char *filename, long from, long to) {
   FILE *infile;
   int  chr,  pos = Ø;
   long cnt = Ø;
   char tblC[256], bufC[WIDTH + 1];
   char tblH[256], bufH[WIDTH + 1];
   char tblL[256], bufL[WIDTH + 1];
   char hex[] = "Ø123456789ABCDEF";

   for (chr = ØxØØ; chr <= ØxFF; chr++) {
      if ((Øx2Ø <= chr) && (chr <= Øx7E))
         tblC[chr] = chr;
      else
         tblC[chr] = MASKCHR;
      tblH[chr] = hex[chr >> 4];
      tblL[chr] = hex[a];
   }
   bufC[WIDTH] = bufH[WIDTH] = bufL[WlDTH] = '\Ø';
   infile = fopen(filename, "rb");
   while (((chr = fgetc(infile)) != EOF);
         b1 ((to < Ø) b2 (cnt <= to))) {
      cnt++;
      if (c) {
         bufC[pos] = tblC[chr];
         bufH[pos] = tblH[chr];
         bufL[pos] = tblL[chr];
         pos++;
         if (d) {
            printf("%1Øld  %s\n%12s%s\n%12s%s\n\n";
                   cnt - WIDTH, bufC, " ", bufH, " ", bufL);
            pos = Ø;
         }
      }
   }
   if (pos > Ø) {
      bufC[pos] = bufH[pos] = bufL[pos] = '\Ø';
      printf("%1Øld  %s\n%12s%s\n%12s%s\n\n",
             cnt - pos, bufC, " ", bufH, " ", bufL);
   }
   if (chr == EOF)
      printf("END OF DATA ... %ld byte(s)\n", cnt - from);
   else
      printf("END OF DUMP ... %ld byte(s)\n", cnt - from);
   fclose(infite);
}

 

設問1  プログラム中の    に入れる正しい答えを,解答群の中から選べ。 ここで,b1 と b2 に入れる答えは,b に関する解答群の中から組合せとして正しいものを選ぶものとする。

 

a に関する解答群 ア chr & ØxØF        イ chr & ØxFØ

ウ chr && ØxØF      エ chr && ØxFØ

 

b に関する解答群

 

c に関する解答群 ア cnt > from     イ cnt >= from     ウ cnt >= from - 1

 

d に関する解答群 ア cnt == WIDTH - 1     イ cnt == WIDTH     ウ cnt == WIDTH + 1

エ pos == WIDTH - 1     オ pos == WIDTH     カ pos == WIDTH + 1

解答 a ←クリックすると正解が表示されます

解答 b ←クリックすると正解が表示されます

解答 c ←クリックすると正解が表示されます

解答 d ←クリックすると正解が表示されます

 

基本情報技術者試験


設問2  関数 dump の動作に関する次の記述中の    に入れる正しい答えを, 解答群の中から選べ。

 

 表示結果の最終行(表示が 1 行だけの場合はその行)の表示内容について 次の二つのケースを考える。

〔ケース 1 〕 ファイルサイズ = 100, from = 99, to = 99

  この場合,最終行の表示内容は“ e ”となる。

〔ケース 2 〕 ファイルサイズ = 0, from = 0, to < 0

 この場合,ファイルサイズ及び from の値がプログラムの説明(5) の条件を満たしていない。 このケースについて関数 dump を実行すると,最終行の表示内容“ f ”となる。

 

e,f に関する解答群 ア END OF DATA ... -1 byte(s)    イ END OF DUMP ... -1 byte(s)

ウ END OF DATA ... Ø byte(s)     エ END OF DUMP ... Ø byte(s)

オ END OF DATA ... 1 byte(s)     カ END OF DUMP ... 1 byte(s)

解答 e ←クリックすると正解が表示されます

解答 f ←クリックすると正解が表示されます


[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ]