このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1307166756/204
#  【質問テンプレ】  
#  [1] 授業単元:プログラム言語 
#  [2] 問題文:コマンドプロンプト上で名前と 
#  国語、社会、数学、理科、社会の5科目の成績を入力して、 
#  それをバイナリファイルで保存するプログラムを作成せよ。 
#  保存するファイル名はこれらを入力する前、つまり一番最初に入力して 
#  そのファイル名で保存するものとする。 
#  30件の入力があるか、EOFの入力を持って入力を終了するものとする。 
#  また、これとは別に入力して作成されたバイナリファイルを開く 
#  プログラムを作成すること。 
#  sample 
#  保存したいファイル名:student.dat 
#  名前:tanaka 
#  国語:65 
#  社会:80 
#  数学:54 
#  理科:71 
#  英語:48 
#    ・ 
#    ・ 
#    ・ 
#  ※30件かEOFの入力を持って終了 
#  プログラムを開くほう 
#  sample 
#  オープンしたいファイル:student.dat 
#  tanakaさんの成績 国語:65点 社会:80点 数学:54点 理科:71点 英語:48点#                        ・ 
#                        ・ 
#                        ・ 
#   

科目名(国語).
科目名(社会).
科目名(数学).
科目名(理科).
科目名(英語).

国語、社会、数学、理科、英語の5科目の成績を入力して、それをバイナリファイルで保存する :-
        length(_成績ならび,30),
        write('保存したいファイル名:'),get_line(_保存ファイル名),
        write('名前:'),get_line(_名前),
        国語、社会、数学、理科、英語の5科目の成績を入力(_名前,_成績ならびの一),
        末尾の変数部分を切り取る(_成績ならびの一,_成績ならび),
        バイナリファイルで保存する(_保存ファイル名,_成績ならび).

国語、社会、数学、理科、英語の5科目の成績を入力(end_of_file,L) :- !.
国語、社会、数学、理科、英語の5科目の成績を入力(_名前,[[_名前|_5科目の成績]]) :-
        '5科目の成績を入力'(_名前,_5科目の成績),
        write('名前:'),get_line(_名前2),!.
国語、社会、数学、理科、英語の5科目の成績を入力(_名前,[[_名前|_5科目の成績]|R]) :-
        '5科目の成績を入力'(_名前,_5科目の成績),
        write('名前:'),get_line(_名前2),
        国語、社会、数学、理科、英語の5科目の成績を入力して(_名前2,R).

'5科目の成績を入力'(_5科目の成績) :-
        findall([_科目名,_成績],(
                    科目名(_科目名),
                    writef('%t: ',[_科目名]),
                    get_integer(_成績)),
                _5科目の成績).

末尾の変数部分を切り取る([],[]) :- !.
末尾の変数部分を切り取る([V|R],[]) :-
        var(V),!.
末尾の変数部分を切り取る([A|R1],[A|R2]) :-
        末尾の変数部分を切り取る(R1,R2).

バイナリファイルで保存する(_保存ファイル名,_成績ならび) :-
        open(_保存ファイル名,write,Outstream,[type(binary)]),
        append(_,[_科目ならび]|R],_成績ならび),
        '8ビットコードで一行分書き出す'(Outstream,_項目ならび),
        R = [],
        close(Outstream),!.

'8ビットコードで一行分書き出す'(Outstream,[_氏名,_5科目ならび]) :-
        氏名の出力(Outstream,_氏名),
        append(_,[[_科目名,_成績ならび]|R],_5科目ならび),
        成績ならびの出力(Outstream,_5科目ならび),
        R = [],
        put_byte(Outstream,10),!.

氏名の出力(Outstream,_氏名) :-
        atom_codes(_氏名,Codes),
        全角文字を8ビット展開(Codes,Codes1),
        append(_,[Code|R1],Code1),
        put_byte(Outstream,Code),
        R1 = [],
        put_byte(Outstream,32),!.

成績ならびの出力(Outstream,_5科目ならび) :-
        append(_[[_科目名,_成績]|R],_5科目ならび),
        科目名の出力(Outstream,_科目名),
        成績の出力(Outstream,_成績),
        R = [],!.

科目名の出力(Outstram,_科目名) :-
        atom_codes(_項目名,Codes),
        全角文字を8ビット展開(Codes,Codes2),
        append(_,[Code|R],Code2),
        put_byte(Outstream,Code),
        R = [],
        put_byte(Outstream,58),!.

成績の出力(Outstram,_成績) :-
        number_codes(_成績,Codes),
        append(_,[Code|R],Code),
        put_byte(Outstream,Code),
        R = [],
        put_byte(Outstream,32),!.

全角文字を8ビット展開([],[]).
全角文字を8ビット展開([N|R1],[N2,N3|R2]) :-
        N >= 256,
        N2 is N // 256,
        N3 is N mod 256,
        全角文字を8ビット展開(R1,R2).
全角文字を8ビット展開([N|R1],[N|R2]) :-
        N < 256,
        全角文字を8ビット展開(R1,R2).