Practice 7: %R, %W コマンドの実装(ファイル操作)

%R と %W を実装し,これまで実装したコマンドの動作確認をしてください.

テストの際には,これまでに実装したコマンドも変わりなく動作していることを確認することが大切です.そのためにも,過去の解説を振り返り,現在のプログラムの全体像を再度確認しておきましょう.

ファイル入出力に関しては,解説「ファイル操作」を読んでみてください.

解答例を用意しました.解答例を見るのは,慎重に.

練習7-1 プログラムの全体像の把握

現状を整理すると,全体の流れを司っているのは,およそ以下の5つの関数と考えられる.

項番

処理名称

関数名

1

main

main()

2

標準入力から1行読み込む

get_line()

3

読み込んだ行を処理をする

parse_line()

4'

CSV字列から項目毎に構造体や配列に保存

new_profile()

5

コマンド文字と引数で示された処理を実行

exec_command()

項番4'は,元の説明では,4 (parse_csv()) と 6 (new_profile())に分かれていた.ここでは,両者を融合する,という説明にしたがい,一つの項番4'としている.

これら5つの関数を組み合わせて,プログラムの全体構造を説明せよ.

  • 項番,処理名称,関数名から成る表を示す

  • プログラムの全体像をC言語風に書く(参考:名簿管理プログラムの流れ ver.2)

  • 各関数間でのやりとりがわかる程度に,引数や戻り値も示して書く

  • 上記の表以外の関数は使わない.必要な処理の概要を説明する.(必要に応じて,制御文if,for,whileは使っても良い.)

以下,C言語風の書き方の例である.概略が伝わるように書いてあれば十分である.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/* 名簿管理プログラムの流れ ver.2 */

/* 2) 標準入力から1行読み込む
 *     line      読み込んだ文字列
 *     (return)  読み込んだ文字数
 */
int get_line(char *line)
{
   /* 標準入力から1行読み込み,line に格納する   */
   /* line の改行文字 `\n` を,`\0` に置き換える */
   return /* 読み込んだ文字数 */;
}

/* (テンプレのため,一部省略.自身で書き加えておくこと.) */

/* 1) main
 *     引数なし
 *     (return)  正常に終了したら 0
 */
int main()
{
   char line[MAX_LINE_LEN + 1];
   while (get_line(line)) {   /* --> 2) */
      parse_line(line);       /* --> 3) */
   }
   return 0;
}

参考:レポートの2章(特に,2.2節と2.3節)に相当する内容である.課題説明資料の4.3.1項にも目を通しておくこと.

練習7-2 %Rコマンドの実装

これまで仮実装していたcmd_read()を完成させよ.

(ヒント)いきなり作り始めるのではなく,まずはget_line()にまつわる課題を解決してから,コマンドとして実装したほうが良い.

練習7-3 %Wコマンドの実装

これまで仮実装していたcmd_write()を完成させよ.

練習7-4 現在までのプログラムの動作確認とテスト

これまで実装したプログラムの動作確認とテストをせよ.どのようなテストを実施すればいいか.

(ヒント)これまでに実装済みの「コマンド」や「機能」は何だったか?新コマンドだけではなく,それらも正常に動作することを確認しよう.