標準ストリーム
[Wikipedia|▼Menu]
.mw-parser-output .ambox{border:1px solid #a2a9b1;border-left:10px solid #36c;background-color:#fbfbfb;box-sizing:border-box}.mw-parser-output .ambox+link+.ambox,.mw-parser-output .ambox+link+style+.ambox,.mw-parser-output .ambox+link+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+style+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+link+.ambox{margin-top:-1px}html body.mediawiki .mw-parser-output .ambox.mbox-small-left{margin:4px 1em 4px 0;overflow:hidden;width:238px;border-collapse:collapse;font-size:88%;line-height:1.25em}.mw-parser-output .ambox-speedy{border-left:10px solid #b32424;background-color:#fee7e6}.mw-parser-output .ambox-delete{border-left:10px solid #b32424}.mw-parser-output .ambox-content{border-left:10px solid #f28500}.mw-parser-output .ambox-style{border-left:10px solid #fc3}.mw-parser-output .ambox-move{border-left:10px solid #9932cc}.mw-parser-output .ambox-protection{border-left:10px solid #a2a9b1}.mw-parser-output .ambox .mbox-text{border:none;padding:0.25em 0.5em;width:100%;font-size:90%}.mw-parser-output .ambox .mbox-image{border:none;padding:2px 0 2px 0.5em;text-align:center}.mw-parser-output .ambox .mbox-imageright{border:none;padding:2px 0.5em 2px 0;text-align:center}.mw-parser-output .ambox .mbox-empty-cell{border:none;padding:0;width:1px}.mw-parser-output .ambox .mbox-image-div{width:52px}html.client-js body.skin-minerva .mw-parser-output .mbox-text-span{margin-left:23px!important}@media(min-width:720px){.mw-parser-output .ambox{margin:0 10%}}

この記事には参考文献外部リンクの一覧が含まれていますが、脚注によって参照されておらず、情報源が不明瞭です。脚注を導入して、記事の信頼性向上にご協力ください。(2019年1月)
標準ストリーム(入力、出力、エラー出力)

標準ストリーム(: standard streams)とは、UNIXUnix系オペレーティングシステム (OS) において、プログラムの活動実体であるプロセスとその実行環境(通常は端末)の間の接続として、(プロセスから見ると)あらかじめ確立されている入出力チャネル(パイプ)である。OSのカーネルではなくシェルで実装されている機能だが、広く使われているため標準化されている。UNIXやUnix系OSでは3つの入出力ストリーム(標準入力標準出力標準エラー出力)が定義される。

一部のプログラミング言語の実装では、UNIXやUnix系以外のシステムでもUnixと同様の使い勝手を提供するよう、これらを模倣するものがある。MS-DOSにはさらに、シリアルポートに対応する標準補助入出力 (stdaux)、プリンターに対応する標準プリンター出力 (stdprn) もあり、今でもWindowsでAUXやPRNという名前をファイルやコマンド等に使おうとすると問題を起こしたりするのは、これらに関してMS-DOSとの互換性があるためである。
背景

UNIX以前の多くのOSでは、プログラムは明示的に適当な入出力に接続する必要があった。多くのシステムにはOS固有の複雑な事情があり、環境設定をしたり、ローカルなファイルテーブルにアクセスしたり、必要なデータセットを指定したり、カードリーダー、磁気テープドライブ、ディスクドライブ、ラインプリンタ、カードパンチ、対話型端末などを正しく扱うといったプログラミング以前のハードルが多数存在した。

UNIXはこの状況に対していくつかの重要な進化を遂げている。その1つが「抽象デバイス(: abstract device)」である。これはプログラム自体がやり取りするデバイスに関する知識を持たなくて済むようにしたものである。古いOSではプログラマはレコード構造を知っておく必要があり、直交性のないことが多いデータ意味論やデバイス制御を扱う必要があった。UNIXはデータストリームという概念によってこのような複雑さを排除した。データストリームとは逐次的なデータバイト列であり、End Of Fileまでリード可能である。プログラムはまた好きなだけバイト列を出力でき、事前にバイト数を宣言しておく必要もないし、それらがどのようにグループ化されているかを宣言する必要もない。

もう1つのUNIXの成し遂げたブレークスルーは、自動的に入力と出力を関連付けることであり、典型的な入力-処理-出力型プログラムでは入出力の設定を何もする必要がない。対照的にそれ以前のOSでは複雑なジョブ制御言語を使ってコネクションを確立するか、それとほぼ同等のことをプログラム本体で行う必要があった。

UNIXが標準ストリームを提供したことで、そのC言語実行環境もそれをサポートするようになった。結果として、多くのC言語実行環境(および派生言語の実行環境)はOSが何であっても同等な機能を提供するようになっている。
標準入力 (stdin)

標準入力(: standard input, stdin)はプログラムに入ってくるデータ(テキストであることが多い)である。プログラムは read 操作を使ってデータ転送を要求する。全てのプログラムが入力を要求するわけではない。例えばdirやlsプログラム(ディレクトリ内のファイル名の一覧を表示する)は、標準入力からのデータを使わないで処理を行う。

リダイレクトしない限り、標準入力はプログラムを起動した端末のキーボードになっている。

標準入力のファイル記述子は0(ゼロ)である。POSIXの <unistd.h> では STDIN_FILENO と定義されている。対応する <stdio.h> での変数は FILE* stdin、<iostream> での変数は std::cin である。
標準出力 (stdout)

標準出力(: standard output, stdout)はプログラムが書き出すデータのストリームである。プログラムは write 操作を使ってデータ転送を要求する。全てのプログラムが出力を要求するわけではない。例えばファイル改名コマンド(mv、move、ren など)は何も出力しない。

このストリームのデフォルト宛先はプログラムを起動した端末のディスプレイになっている。リダイレクトにより容易に宛先を変更できる。

標準出力のファイル記述子は1である。POSIXの<unistd.h>ではSTDOUT_FILENOと定義されている。対応する<stdio.h>での変数はFILE* stdout、<iostream>での変数はstd::coutである。
標準エラー出力 (stderr)

標準エラー出力(: standard error, stderr)は、エラーメッセージや診断メッセージを出力するためのもう1つの出力ストリームである。標準出力とは独立しているため、一方だけをリダイレクトすることができる。デフォルトでは端末(のディスプレイ)になっており、標準出力がリダイレクトされていて画面に表示されなくとも、エラーメッセージだけはユーザーが目にするようになっている。例えば、パイプで出力が他のプログラムの入力に接続されている場合でも、標準エラー出力は直接端末のディスプレイに届く。

標準出力と標準エラー出力を同じ出力先(端末など)にリダイレクトすることもよくある。バッファが関与しない場合、メッセージはプログラムが書いた順序で現れる。典型的な例として、標準エラー出力がバッファリングされておらず、標準出力が行単位でバッファリングされている場合、後から標準エラー出力に書かれたメッセージが先に端末上に表示されることがある(標準出力のバッファが満杯になっていない場合)。

標準エラー出力のファイル記述子は2である。POSIXの<unistd.h>ではSTDERR_FILENOと定義されている。対応する<stdio.h>での変数はFILE* stderr、<iostream>での変数は2つありstd::cerrとstd::clogである。前者はバッファリングされておらず、後者はC++の他のストリームと同様にバッファリングされている。



歴史
1950年代: FORTRAN

FORTRANにもUNIXのようなファイル記述子があり、UNIT=5がstdin、UNIT=6がstdoutを表す。! FORTRAN 77 example PROGRAM MAIN READ(UNIT=5,*)NUMBER WRITE(UNIT=6,'(F5.3)')' NUMBER IS: ',NUMBER END
1960年: ALGOL 60

ALGOL 60には、標準ストリーム(ファイルアクセス)の概念が存在しない。
1968年: ALGOL 68

ALGOL 68では、入力 (input) と出力 (output) をあわせてtransputと呼ぶ。Cornelis H. A. Kosterはtransput標準を定義した。この標準にはstand in、stand out、stand error、stand backがある。

例: # ALGOL 68 example #main:( REAL number; getf(stand in,($g$,number)); printf(($"Number is: "g(6,4)"OR "$,number)); # OR # putf(stand out,($" Number is: "g(6,4)"!"$,number)); newline(stand out))入力:出力:
3.14159Number is: +3.142 OR Number is: +3.142!

1970年代: CとUnix

C言語では、stdin、stdout、stderrのストリームはUnixのファイル記述子 0、1、2にそれぞれ対応する。
1995年: Java

Javaでは、標準ストリームはSystem.in (stdin)、System.out (stdout)、System.err (stderr) で参照される。public static void main(String args[]) { try { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String s = br.readLine(); double number = Double.parseDouble(s); System.out.println("Number is:" + number); } catch (Exception e) { System.err.println("Error:" + e.getMessage()); }}
2000年代: .NET

C#などの.NET言語では、標準ストリームはSystem.Console.In (stdin)、System.Console.Out (stdout)、System.Console.Error (stderr) で参照される。stdinおよびstdoutストリームの基本的な読み書きの場合、クラスSystem.Consoleを使って直接アクセスすることもできる(つまり、System.Console.Out.WriteLine()の代わりにSystem.Console.WriteLine()を使える)。

System.Console.In、System.Console.Out、System.Console.Errorは System.IO.TextReader (stdin) および System.IO.TextWriter (stdout, stderr) オブジェクトであり、テキストベースの標準ストリームにしかアクセスできない。標準ストリームへの完全バイナリアクセスにはSystem.IO.Streamオブジェクトを使う必要があり、それぞれSystem.Console.OpenStandardInput()、System.Console.OpenStandardOutput()、System.Console.OpenStandardError()で得られる。// C# examplepublic static int Main(string[] args){ try { string s = System.Console.In.ReadLine(); double number = double.Parse(s); System.Console.Out.WriteLine("Number is: {0:F3}", number); return 0; // If Parse() threw an exception } catch (System.ArgumentNullException) { System.Console.Error.WriteLine("No number was entered!"); } catch (System.FormatException) { System.Console.Error.WriteLine("The specified value is not a valid number!"); } catch (System.OverflowException) { System.Console.Error.WriteLine("The specified number is too big!"); } return -1;}' Visual Basic .NET examplePublic Function Main() As Integer Dim number As Double Dim s As String Try s = System.Console.In.ReadLine() number = CDbl(s) System.Console.Out.WriteLine("Number is: {0:F3}", number) Return 0 Catch e As System.InvalidCastException ' if CDbl() threw an exception System.Console.Error.WriteLine("No number was entered!") Return 1 End TryEnd Function


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:18 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef