program printer(input, output); var line :varying[128] of char; filename:varying[128] of char; infile : text; begin write('Enter file name:'); readln(filename); reset(infile, filename); while not eof(infile) do begin readln(infile, line); writeln(line); end; end.このプログラムは、ファイルの名前を入力すると、その中身を画面に表示する。
var line :varying[128] of char;という変数宣言は、 line が文字列をしまえる配列であり、そこには最 大 128 文字まで入れられるという宣言である。 これは、 array [1..128] of charという配列宣言とほとんど同じ意味であるが、128文字 いっぱいではなくて途中で終るということを表現できるかどうかというあたり で違っている。以下、この varying 型の配列を文字列という。
varying 型の文字列も、 integer や real の変数と同じように、 readln でキーボード(またはファイル)から読み込んだり、 writeln や write で書 き出したりすることができる。
上でやっているのは読む場合であり、
infile : text;で「テキスト型」の変数を宣言すると、これがファイルとして使える。 filename が文字列であると、
reset(infile, filename);とすることで、 infile という変数が filename で指定されたファイルに関係 付けられる。というと意味が良くわからないが、要するに、
readln(infile, line);というふうに、 infile をつけると、キーボードからではなくさっき filename で指定したファイルから読むということである。
ちなみに、ファイルに書くときには、例えば
filename:varying[128] of char; outfile : text; begin ...... rewrite(outfile, filename); writeln(outfile, 'This output goes to filename'); ......というような具合になる。
program printer(input, output); var line :varying[128] of char; filename:varying[128] of char; infile : text; lineno : integer; begin write('Enter file name:'); readln(filename); reset(infile, filename); lineno := 1; while not eof(infile) do begin readln(infile, line); writeln(lineno:8, ':', line); lineno := lineno + 1; end; end.
program record_sort(input, output); type student_record = record name : varying[30] of char; id : integer; score: integer; end; var n : integer; student : array[1..100] of student_record; i,j : integer; work : student_record; infile : text; procedure read_student(var student : student_record); begin readln(infile,student.name); readln(infile,student.id); readln(infile,student.score); end; procedure write_student( student : student_record); begin writeln(student.score:4,student.name:20, student.id:8); end; begin reset(infile, 'student.dat'); n := 0; while not eof(infile) do begin n := n +1; read_student(student[n]); end; writeln('Input data'); for i := 1 to n do write_student(student[i]); for i := 1 to n - 1 do begin for j := i + 1 to n do begin if student[i].score < student[j].score then begin work := student[i]; student[i]:= student[j]; student[j]:= work; end; end; end; writeln('Sorted data'); for i := 1 to n do write_student(student[i]); end.
type student_record = record name : varying[30]; id : integer; score: integer; end;というところで、 student_record という名前のレコード型を宣言 (定義)している。ここでは、 student_recordというレコードは、 name、 id、 scoreという3個のフィールドを持ち、それぞれ は varying[30] of char, integer, integer 型であると宣言している。このよう にしておくと、このレコード型の変数というものを使える。 例えば、 var a_student : student_record; と宣言したとする。この時、それぞれのフィールドを、 a_student.score := 0; とか writeln(a_student.name); とかいっ たように、変数名{.}フィールド名という形式で使うことができる。 また、レコード型同士の代入もできる。(サンプルプログラム参照)
Makino, J. 140391 49 Tsutsumi, E. 250011 80 Yamaguchi, K. 040124 95 Sugimoto, D. 999999 100 Ueda, K. 430011 70