このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1342966104/473
#  [1] 授業単元:C言語 
#  [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/rlR3n 
#  
#  (問題文)ファイルgifts.datからデータを読み込み、
#  構造体のポインタ配列にデータを格納する。この際、利用する分だけ動的に
#  メモリを確保する。読み込んだ結果は、gifts.datとは別のファイルに出力せよ。
#  (ファイル名は自由)また、入力ファイル名を標準入力から指定できるようにせよ。
#   
#  gifts.dat
#   
#  JZK-30 jizake_tsumeawase 4500
#  BSP-15 Body_soap_set 3000
#  BT-200 Bath_towel_set 2500
#  TEA-20 koutya_tsumeawase 5000
#   
#  実行例:
#  データ数を入力してください:4
#  ファイル名を入力してください:gifts.dat
#  表示形式変換後ファイルに出力しました

'ファイルgifts.datからデータを読み込む。読み込んだ結果は、表示形式変換後、gifts.datとは別のファイルに出力する' :-
        データ数を入力してください(_データ数),
        ファイル名を入力してください(_ファイル名),
        'ファイルgifts.datからデータを読み込む。'(_データ数,LL),
        表示形式変換後(LL,_項ならび),
        '読み込んだ結果は、gifts.datとは別のファイルに出力する'(_ファイル名,_項ならび).

ファイル名を入力してください(_ファイル名) :-
        write('出力ファイル名を入力してください: '),
        get_line(_ファイル名).

データ数を入力してください(_データ数) :-
        数を得る(データ数,_データ数).

'ファイルgifts.datからデータを読み込む。'(_データ数,LL) :-
        open('gifts.dat',read,Instream),
        'Instreamからデータを読み込む。'(Instream,_データ数,LL),
        close(Instream).

'Instreamからデータを読み込む。'(Instream,_データ数,[]) :-
        at_end_of_stream(Instream),!.
'Instreamからデータを読み込む。'(Instream,0,[]) :- !.
'Instreamからデータを読み込む。'(Instream,N,[L|R]) :-
        get_split_line(Instream,[' '],L),
        N_1 is N - 1,
        'Instreamからデータを読み込む。'(Instream,N_1,R).

表示形式変換後([],[]).
表示形式変換後([L|R1],[P|R2]) :-
        P =.. [gifts|L],
        表示形式変換後(R1,R2).

'gifts.datとは別のファイルに出力する'(_ファイル名,L) :-
        open(_ファイル名,write,Outstream),
        'gifts.datとは別のOustreamに出力する'(Outstream,L),
        close(Oustream),
        write('表示形式変換後ファイルに出力しました\n').

'gifts.datとは別のOustreamに出力する'(Outstream,L) :-
        append(_,[P|R],L),
        writef(Outstream,'%t.\n',[P]),
        R = [].