東京理科大学 infoserv[更新日]1999.04.30


次の問7から問10までの4問については,この中から1問を選択し,
答案用紙の選択欄のを マークして解答してください。
 なお,2問以上選択した場合には,はじめの1問について採点します。

問7

〔プログラムの説明〕

階層構造をもつファイルシステムにおいて,指定されたファイル又はディレクトリに ついての情報の一覧を表示する関数 flist がある。

(1) ファイルシステムの構造は,次のとおりである。

 図 1 のようなディレクトリとファイルから なる階層をもつ。階層の深さは最大 32 層である。

 

           図1 階層構造の例

 ファイルシステム内では,ディレクトリ ごとに,そのディレクトリの子のファイルと子のディレクトリをまとめて一つのファイル テーブルで管理する。ファイルテーブルの要素をファイルエントリと呼ぶ。 ファイルエントリの内容を表に,ファイルテーブルの例を図 2 に示す。

          表 ファイルエントリの内容

要素

内容

タイプ “F”:ファイル “D”:ディレクトリ
“X”:未使用 “E”:テーブル中の最後のエントリ
名前 ファイル名又はディレクトリ名
(同一階層内で一意な 12 文字以内の英数字列)
サイズ タイプ=“F”のとき,ファイルの大きさ(単位:バイト)
タイプ=“D”のとき,値 0
リンク タイプ=“F”のとき,ファイルへのポインタ
タイプ=“D”のとき,子のディレクトリのファイルテーブルへのポインタ

      図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);

 


東京理科大学 infoserv 戻る 次頁:問08