第11回 ファイル操作2(6月24日)

今日の課題

■ 1文字入力と返却

fgetc ファイルから1文字入力する関数。返り値が EOF のときは、ファイルの終端、または、エラーを表す。

ungetc 入力した1文字をファイルに返す。たとえば、ファイルの入力時に1文字先を見て処理を判断することに有効。

⇒ list1101.c

■ ftell と fseek

ftell 現在参照しているファイルの上の位置を求める関数。

ファイル「data2」の中の最初の「@」の位置を調べる ⇒ list1102.c

fseek ファイルの参照位置を定める関数。

ファイル「data2」の指定位置から3文字を表示する ⇒ list1103.c

□ 課題1

次の書式のデータファイル「data3」から、数値を抽出し表示する、そして、フォーマットに対応する部分の最後の「改行」の次のファイル位置を表示するプログラムを作成せよ。プログラムのサンプルを示す。 ⇒ prac1101.c

「非数値文字列1」、「数値文字列1」、「非数値文字列2」、「数値文字列2」、「非数値文字列3」、「数値文字列3」、「非改行文字列1」、「改行」

ここで、「非数値文字列1」および「非改行文字列1」は省略される場合がある。

さらに、「非数値文字列」の中に「#」があると「改行」までは「非数値文字列」とみなす。

データファイルの例をここに示す。⇒ data3a data3b data3c data3d

正しく動作するとそれぞれ以下の表のように出力される。
data3a data3b data3c data3d
100 100 100 100
200 200 200 200
300 300 300 300
19 12 27 39

◇ ヒント

ignore_line() ここでは、1文字を入力し、その結果が '\n' でないならば、同様の処理を繰り返す。

skip_to_num() まずは、「#」は考えずにプログラムを作ろう。1文字を入力し、その結果が '0' から '9' の間の文字コードでないならば、同様の処理を繰り返す。ただし、'0'から'9'の間の文字コードならば、その入力をungetcを使って返す。'0'から'9'の間の文字コードを調べるには、isdigit() という関数がある。

get_num() 数の文字を1つ読むと、その時まで読んだ数を 10 倍して加算する。たとえば、「1」を読んだ状態では「num=1」であり、加えて「2」を読むと全体で「12」と読んだことになるので「num = num * 10 + 2 = 12」となる。さらに「3」を読むと全体で「123」であり「num = num * 10 + 3 = 123」となる。「'3'」を「3」に変換するには「'3' - '0'」とすればよい。

■ 宿題

課題1のプログラムを完成させプリントアウトし、各行にコメントを手書きせよ。コメント付きプログラムリストを提出せよ。来週(7月1日)の授業開始時に集めます。

2004.6.21 by tokuhisa