問7
〔プログラムの説明〕
階層構造をもつファイルシステムにおいて,指定されたファイル又はディレクトリに ついての情報の一覧を表示する関数 flist がある。
(1) ファイルシステムの構造は,次のとおりである。
図 1 のようなディレクトリとファイルから なる階層をもつ。階層の深さは最大 32 層である。
図1 階層構造の例
ファイルシステム内では,ディレクトリ ごとに,そのディレクトリの子のファイルと子のディレクトリをまとめて一つのファイル テーブルで管理する。ファイルテーブルの要素をファイルエントリと呼ぶ。 ファイルエントリの内容を表に,ファイルテーブルの例を図 2 に示す。
表 ファイルエントリの内容
要素
内容
図2 ファイルテーブルの例(図1を表したもの)
パス名とは,ルートディレクトリから 始まり,特定のファイルやディレクトリにたどり着くための一意な経路を示す名前である。 各階層は“/”で区切る。例えば,図 1 の file4 のパス名は“/sub1/file4”, sub2 の パス名は“/sub2”である。
(2) 関数 flist の引数は,ルートディレクトリのファイルテーブルへのポインタ root と,パス名を格納した文字列へのポインタ path_name である。path_name の内容は, パス名の書式としては正しいものとする。すなわち,“/”で始まり,ファイル又は ディレクトリ名は 12 文字以内の英数字列となっている。
(3) path_name の内容に応じて,次のいずれかの処理を行う。
ファイルの場合は,ファイル名とファイルの 大きさを表示する。
ディレクトリの場合は子の情報を表示する。 子がファイルのときはファイル名とファイルの大きさ,子がディレクトリのときは ディレクトリ名と文字列 “Directory”を表示する。子がないときは何も表示しない。
パス名に対応する経路が存在しない場合は, エラーメッセージを表示する。
例:図 1 の構造を用いた例
〔プログラム〕 #include <stdio.h> #include <string.h> #define F_FILE 2 #define F_DIRECTORY 1 #define F_UNMATCH 0 struct fentry { char type; char name[13]; long size; struct fentry *next; }; void flist(struct fentry *root, char *path_name) { struct fentry *fptr; char path[512], *name_tbl[32], *cptr; int idx, max, flag; strcpy(path, path_name); if (strcmp(path, "/") == 0) { flag = F_DIRECTORY; fptr = root; } else { /* パス名の分解 */ idx = 0; cptr = path; while (*cptr != '\0') { if (*cptr == '/') { *cptr = '\0'; idx++; } cptr++; } max = idx - 1; /* パス名の検索 */ fptr = root; for (idx = 0; idx <= max; idx++) { flag = F_UNMATCH; while (fptr->type != 'E') { if ( && strcmp(fptr->name, name_tbl[idx]) == 0) { if (fptr->type == 'D') { /* ディレクトリ */ flag = F_DIRECTORY; break; } else if (idx == max) { /* ファイル */ flag = F_FILE; break; } else break; /* パス名の途中がファイルだった */ } fptr++; } if (flag == F_UNMATCH) break; } } /* ファイル・ディレクトリの表示 */ switch (flag) { case F_DIRECTORY: while ( ) { if (fptr->type == 'D') printf("%s \tDirectory\n", fptr->name); else if (fptr->type == 'F') printf("%s \t%ld bytes\n", fptr->name, fptr->size); fptr++; } break; case F_FILE: printf("%s \t%ld bytes\n", fptr->name, fptr->size); break; default: printf("File or directory not found !!\n"); } }
設問 プログラム中の に入れる 正しい答えを,解答群の中から選べ。
a に関する解答群
ア name_tbl[idx] = cptr;
イ name_tbl[idx] = cptr + 1;
ウ name_tbl[idx] = *cptr;
エ name_tbl[idx] = path + cptr;
オ name_tbl[idx] = *(path + cptr);
b,d に関する解答群
ア fptr->type == 'D' イ fptr->type == 'E'
ウ fptr->type == 'F' エ fptr->type == 'X'
オ fptr->type != 'D' カ fptr->type != 'E'
キ fptr->type != 'F' ク fptr->type != 'X'
c に関する解答群
ア fptr += fptr->next;
イ fptr = fptr->next;
ウ fptr = *(fptr->next);
エ *fptr += fptr->next;
オ *fptr = fptr->next;
カ *fptr = *(fptr->next);