|
2.12.3 発展: ストリームと低レベルの入出力
ファイルやパイプはストリームと呼ばれる Mathematicaオブジェクトの例である.Mathematicaのストリームは入出力のソースである.ストリームにはさまざまな操作を行うことができる.
<<や >>は高レベルの Mathematica入出力関数であると考えることができる.これらは,ストリームを直接扱う低レベルの入出力プリミティブを基礎として作られている.これらのプリミティブを使うことに よって,Mathematicaの入出力をもっと厳密に制御することができる.例えば,中間的なデータをファイルやパイプとやり取りをする Mathematicaプログラムを書こうとすれば,これを利用することが必要となる.
出力をストリームに書き出す低レベル手順の基本は次のようである.まず,OpenWriteまたは OpenAppendを実行してストリームを開く.これは,どのファイルまたは外部プログラムに,どんな形式で出力を書き込もうとするかを Mathematicaに指定するものである.ストリームが開かれたら,WriteやWriteStringを使って実際に式や文字列をそのストリームに書き込む.終ったら,Closeを実行してそのストリームを閉じる.

Mathematicaのストリーム
ファイルまたはパイプを開くと,Mathematicaはそのファイルやパイプを対象とするストリームを指定するストリームオブジェクトを作る.一般に,ストリームオブジェクトはファイル名またはパイプで使われる外部コマンド名と,一意的な数を含む.
ストリームオブジェクトがもつこの数は,同一のファイルや外部コマンドに複数のストリームを作ることができるため,それらを区別するのに使われる.例えば,同じ外部プログラムにいくつかのインスタンスを開始すると,それぞれは別のストリームに接続される.
しかし,開いたストリームが 1つだけであれば,単にファイル名や外部コマンド名でこのストリームを参照することができる.
ファイル tmpへの出力ストリームを開く.
In[1]:= stmp = OpenWrite["tmp"]
Out[1]= 
式の列をファイルに書き出す.
In[2]:= Write[stmp, a, b, c]
tmpに開かれているストリームは1つだけであるから,ファイル名を指定するだけでこれを参照することができる.
In[3]:= Write["tmp", x]
このストリームを閉じる.
In[4]:= Close[stmp]
Out[4]= 
ファイルの内容を表示する
In[5]:= !!tmp
"abc
x"

低レベルの出力関数
関数 Write[stream, expr]を実行すると,式が指定のストリームに書き込まれる.デフォルトでは Mathematicaの入力形で書かれる.式の列を引数として Writeを実行すると,それらの式を順にストリームに書き出す.一般に,式と式の間にスペースは挿入されない.しかし,すべての式が書かれると,Writeは常に最後に改行する.
ファイル tmpを再び開く.
In[6]:= stmp = OpenWrite["tmp"]
Out[6]= 
式の列をファイルに書き出し,ファイルを閉じる.
In[7]:= Write[stmp, a^2, 1 + b^2]; Write[stmp, c^3]; Close[stmp]
Out[7]= 
式はすべて入力形で書かれている.1つの Writeで書かれた式は同一の行に書かれる.
In[8]:= !!tmp
"a^21 + b^2
c^3"
Writeは Mathematica式を完結した式として書き出す方法である.しかし,場合によってはデータを構造化されていないまま書き出したいこともある.WriteStringは任意の文字列を書き出す.これは Writeや WriteStringと違って,最後に改行やその他の記号を加えない.
ストリームを開く.
In[9]:= stmp = OpenWrite["tmp"]
Out[9]= 
2組の文字列をストリームに書き出す.
In[10]:= WriteString[stmp, "Arbitrary output.\n", "More output."]
文字列をもう 1つ書き加えて,ストリームを閉じる.
In[11]:= WriteString[stmp, " Second line.\n"]; Close[stmp]
Out[11]= 
ファイルの内容を表示する.文字列は改行も含んでそのままの形で書かれている.
In[12]:= !!tmp
"Arbitrary output.
More output. Second line."

出力をストリームに書き出す方法
関数 Writeと WriteStringの重要な機能の 1つは,出力を単に 1つのストリームに書くだけでなく,複数のストリームに書けることである.
Mathematicaでは,複数のストリームのリストを channelとして定義しておくと便利である.単にこのチャンネルを指定すれば,Mathematicaは同一のオブジェクトを複数のストリームに書き出すことができる.
標準の対話的 Mathematicaセッションでは,普通いくつかのチャンネルが利用されている.これらには特定の出力が送られる先が指定されている.したがって,例えば $Outputは標準出力の宛先が,$Messagesはメッセージの宛先が指定されている.したがって,関数 Printは基本的に Writeを $Outputに宛てて実行する.同様に,MessageはWriteを$Messagesに宛てて実行する.2.14.1に代表的な Mathematicaセッションで使われるチャンネルのまとめがある.
Mathematicaを MathLinkで使っているときは普通,別な方法が取られることに注意する.すべての出力は大抵は単一の MathLinkリンクに書かれる.個々の出力は型を指定したパケットという形態を取る.
ほとんどの場合,Mathematicaの使うファイル名または外部コマンド名は,使っているコンピュータのオペーレーティングシステムに準拠している.ただし,システムによっては特殊な名のストリームをサポートしている場合もある.

あるコンピュータシステムにおける特別なストリーム
特別なストリーム "stdout"は,出力をオペーレーティングシステムの標準出力に送るためのものである.しかし,これはテキスト型インターフェースのMathematicaでのみ使われることに注意する.もっと複雑な使い方をしているときはこのストリームは機能せず,使おうとすると混乱を招くことになる.

出力ストリームのオプション
出力ストリームにはいくつかのオプションがある.これらのオプションは,OpenWriteや OpenAppendで初めにストリームを開くときに指定する.
ストリームを開き,OutputFormを出力フォーマットのデフォルト設定とする.
In[13]:= stmp = OpenWrite["tmp", FormatType -> OutputForm]
Out[13]= 
式をストリームに書き出し,ストリームを閉じる.
In[14]:= Write[stmp, x^2 + y^2, " ", z^2]; Close[stmp]
Out[14]= 
式は OutputFormで書かれている.
In[15]:= !!tmp
" 2 2 2
x + y z"
式を書き出すときに特にフォーマットを指定すれば,これがストリームにデフォルトで設定された出力フォーマットより優先される.OutputFormや TeXForm等,Mathematicaのフォーマット指示子を明示的に指定して,式をストリームに書き出せばよい.
オプション PageWidthは Mathematicaのドキュメントの出力のページ幅を指定する.出力はこの幅に収まるように改行される.改行したくないときは PageWidth -> Infinityと指定する.しかし,普通 PageWidthには出力機に合わせた数字を与える.多くのシステムでは,この値を見出すためには外部プログラムを走らせる必要がある.SetOptionsを使って,PageWidthのデフォルト値を取得する設定をすることができる.例えば PageWidth :> <<"!devicewidth"とすれば,外部プログラムが起動されて適切な値が設定される.
ストリームを開き,ページ幅を 20文字とする.
In[16]:= stmp = OpenWrite["tmp", PageWidth -> 20]
Out[16]= 
式を書き込み,ストリームを閉じる.
In[17]:= Write[stmp, Expand[(1 + x)^5]]; Close[stmp]
Out[17]= 
書き込まれた式は最大 20文字の行に分割されている.
In[18]:= !!tmp
"1 + 5*x + 10*x^2 +
10*x^3 + 5*x^4 +
x^5"
オプション CharacterEncodingは,特殊文字を含む文字列が Writeまたは WriteStringで特定の出力ストリームに送られるとき,これに使用する文字コード規格を指定する.CharacterEncodingは,主に異なる言語に変換するとき,または出力機が解釈できない文字を受け取らないようにするために使われる.

ストリームのオプションの操作
デフォルトのオプション設定でストリームを開く.
In[19]:= stmp = OpenWrite["tmp"]
Out[19]= 
オプション FormatTypeを開いたストリームに設定し直す.
In[20]:= SetOptions[stmp, FormatType -> TeXForm];
Optionsは設定されているオプションを示す.
In[21]:= Options[stmp]
Out[21]= 
ストリームを閉じる.
In[22]:= Close[stmp]
Out[22]= 

標準出力チャンネルへのオプションの操作
セッション中は常に,Mathematicaは開かれているすべての入力および出力ストリームをそのオプションとともに管理しており,これは Streams[ ]にリストとして書かれている.これを直接見てみると便利なことがある.しかし,このリストを直接変更することはできない.これは OpenRead等の関数によって変更される.
|