「ストリーム」の編集履歴(バックアップ)一覧はこちら
「ストリーム」(2014/05/07 (水) 13:14:40) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
ストリーム系述語 see/2,get0/2,tell/2,put/2
ファイルのオープン・クローズ、また、入出力に関する述語を説明します。
-see/2
seeは第一引数を入力ファイルとしてオープンし、そのストリーム値を第二引数の変数にユニファイする述語です。
このストリーム値を後述するget0などの第一引数に渡すと、指定ファイルからの入力が可能となります。
seeのあとは、入力終了後に必ずseenという述語にストリーム値を渡してクローズする必要があります。
-get0/2
get0はseeの第2引数に返されたストリーム値を渡すことで任意のストリームから読み込むことの出来る述語です。
入力値は1文字ずつ取り出され第二引数に文字コードで返されます。
-例 see,seen,get0
test:-
kanji_mode(_,on),
see('a.txt',S),
repeat,gets(S,X,N),f(X),N=:=1,
seen(S).
f(X):-name(Y,X),write(Y),nl.
gets(S,L,N):-get0(S,X),gets(S,X,L,N).
gets(S,4,[],1):-!. %for Linux
gets(S,26,[],1):-!. %for windows
gets(S,10,[],0):-!. %LF
gets(S,13,[],0):-!. %CR
gets(S,31,[],0):-!. %for az-prolog
gets(S,X,[X|L],N):-gets(S,L,N).
a.txt(事前に作成しておきます)
0123456789
あいうえお
Hello
今日
-解説
testという述語は最初にsee述語でa.txtというテキストファイルを読み込んでいます。
次に使用されているrepeatという述語は、その述語以降でfailが起きた場合に、処理を繰り返す述語です。
ここでは、ファイルの終了フラグN=1が立てられるまで、failさせて繰り返す使い方をしています。
get0は読み込まれたファイルの値を1文字づつ取り出しています。
fという述語は自作の述語です。
ここでは単にgets述語で得られたjisコードを格納したリストをアトムに型変換して
write述語でインタプリタに出力しているだけの述語です。
最後にseenによって入力ストリームをクローズしています。
なお、この例では文字コードをWindows環境を想定して作られているため、環境が異なる場合には、
EOFや改行コードが異なる場合があります。
-実行してみましょう
?-test.
123456789
あいうえお
Hello
今日
a.txtの内容がget0で取り出された文字コードの形で出力されていることがわかります。
----
-tell/2
tellは第一引数を出力ファイルとしてオープンし、そのストリーム値を第二引数の変数にユニファイする述語です。
このストリーム値を後述するputなどの第一引数に渡すと、指定ファイルへの出力が可能となります。
tellのあとは、必ずtoldという述語にストリーム値を渡してクローズする必要があります。
-put/2
putはtellの第2引数に返されたストリーム値を渡すことで任意のストリームに出力することの出来る述語です。
入力値はアスキーコードとして認識され、出力時には対応する文字が出力されます。
-例 tell,told,put
test:-
see('a.txt',S),
tell('b.txt',S2),
repeat,get0(S,X),put(S2,X),X=:=26,
told(S2),
seen(S).
a.txt(事前に作成しておきます)
1
2
3
-解説
上記の例は最初にsee述語でa.txtというテキストファイルを読み込んでいます。
次にtellで出力先のファイルb.txtを指定しています。
そして、get0によって入力ファイルの値を取得し、putで出力ファイルへ書き込みを行っています。
以上の処理を入力値がファイルの最後(EOF)となるまで、repeatで繰り返しています。
最後にそれぞれ、toldとseenで出力ファイルと入力ファイルをクローズさせています。
-実行してみると、a.txtと同じ内容のb.txtというファイルが作成されます。
----
***まとめ
今回は以下の事を学習しました。
・入出力ストリームのオープン・クローズ
ストリーム系述語 see/2,get0/2,tell/2,put/2
ファイルのオープン・クローズ、また、入出力に関する述語を説明します。
-see/2
seeは第一引数を入力ファイルとしてオープンし、そのストリーム値を第二引数の変数にユニファイする述語です。
このストリーム値を後述するget0などの第一引数に渡すと、指定ファイルからの入力が可能となります。
seeのあとは、入力終了後に必ずseenという述語にストリーム値を渡してクローズする必要があります。
-get0/2
get0はseeの第2引数に返されたストリーム値を渡すことで任意のストリームから読み込むことの出来る述語です。
入力値は1文字ずつ取り出され第二引数に文字コードで返されます。
-例 see,seen,get0
test:-
kanji_mode(_,on),
see('a.txt',S),
repeat,gets(S,X,N),f(X),N=:=1,
seen(S).
f(X):-name(Y,X),write(Y),nl.
gets(S,L,N):-get0(S,X),gets(S,X,L,N).
gets(S,4,[],1):-!. %for Linux
gets(S,26,[],1):-!. %for windows
gets(S,10,[],0):-!. %LF
gets(S,13,[],0):-!. %CR
gets(S,31,[],0):-!. %for az-prolog
gets(S,X,[X|L],N):-gets(S,L,N).
a.txt(事前に作成しておきます)
0123456789
あいうえお
Hello
今日
-解説
testという述語は最初にsee述語でa.txtというテキストファイルを読み込んでいます。
次に使用されているrepeatという述語は、その述語以降でfailが起きた場合に、処理を繰り返す述語です。
ここでは、ファイルの終了フラグN=1が立てられるまで、failさせて繰り返す使い方をしています。
get0は読み込まれたファイルの値を1文字づつ取り出しています。
fという述語は自作の述語です。
ここでは単にgets述語で得られたjisコードを格納したリストをアトムに型変換して
write述語でインタプリタに出力しているだけの述語です。
最後にseenによって入力ストリームをクローズしています。
なお、この例では文字コードをWindows環境を想定して作られているため、環境が異なる場合には、
EOFや改行コードが異なる場合があります。
-実行してみましょう
?-test.
123456789
あいうえお
Hello
今日
a.txtの内容がget0で取り出された文字コードの形で出力されていることがわかります。
----
-tell/2
tellは第一引数を出力ファイルとしてオープンし、そのストリーム値を第二引数の変数にユニファイする述語です。
このストリーム値を後述するputなどの第一引数に渡すと、指定ファイルへの出力が可能となります。
tellのあとは、必ずtoldという述語にストリーム値を渡してクローズする必要があります。
-put/2
putはtellの第2引数に返されたストリーム値を渡すことで任意のストリームに出力することの出来る述語です。
入力値はアスキーコードとして認識され、出力時には対応する文字が出力されます。
-例 tell,told,put
test:-
see('a.txt',S),
tell('b.txt',S2),
repeat,get0(S,X),put(S2,X),X=:=26,
told(S2),
seen(S).
a.txt(事前に作成しておきます)
1
2
3
-解説
上記の例は最初にsee述語でa.txtというテキストファイルを読み込んでいます。
次にtellで出力先のファイルb.txtを指定しています。
そして、get0によって入力ファイルの値を取得し、putで出力ファイルへ書き込みを行っています。
以上の処理を入力値がファイルの最後(EOF)となるまで、repeatで繰り返しています。
最後にそれぞれ、toldとseenで出力ファイルと入力ファイルをクローズさせています。
-実行してみると、a.txtと同じ内容のb.txtというファイルが作成されます。
----
***まとめ
今回は以下の事を学習しました。
・入出力ストリームのオープン・クローズ