コンピュータプログラミングでは、標準ストリームは、コンピュータプログラムの実行開始時に、プログラムと環境の間で事前に接続された入出力通信チャネルです[ 1 ] 。3つの入出力(I/O)接続は、標準入力(stdin)、標準出力(stdout)、標準エラー(stderr )と呼ばれます。元々、I/Oは物理的に接続されたシステムコンソール(キーボードによる入力、モニターによる出力)を介して行われていましたが、標準ストリームはこの仕組みを抽象化しています。コマンドが対話型シェルを介して実行される場合、ストリームは通常、シェルが実行されているテキスト端末に接続されますが、リダイレクトやパイプラインによって変更されることもあります。より一般的には、子プロセスは親プロセスの標準ストリームを継承します。

ユーザーは一般的に、標準ストリームを、入力デバイスから送られてくるデータを処理する、またはアプリケーションから書き込むデータを処理する入出力チャネルとして認識しています。データは、任意のエンコーディングのテキスト、またはバイナリデータである可能性があります。プログラムがデーモンとして実行される場合、その標準エラー出力ストリームは、通常、エラー分析のためにログファイルにリダイレクトされます。
ストリームはアプリケーションを連結するために使用できます。つまり、あるプログラムの出力ストリームを別のアプリケーションの入力ストリームとしてリダイレクトできます。多くのオペレーティングシステムでは、これはアプリケーション名を縦棒(バー)で区切って列挙することで表現されます。この縦棒はパイプライン文字と呼ばれることもあります。よく知られた例としては、 moreなどのページネーションアプリケーションの使用が挙げられます。これにより、ユーザーはディスプレイ上の出力ストリームの表示を制御できます。
Unix以前のほとんどのオペレーティングシステムでは、プログラムは適切な入出力デバイスに明示的に接続する必要がありました。OS固有の複雑な仕組みのため、これは面倒なプログラミング作業でした。多くのシステムでは、環境設定の制御、ローカルファイルテーブルへのアクセス、目的のデータセットの特定、そしてパンチカードリーダー、磁気テープドライブ、ディスクドライブ、ラインプリンタ、カードパンチ、対話型端末などのハードウェアの適切な処理が必要でした。
Unixの画期的な進歩の一つに抽象デバイスがあり、これによりプログラムは通信相手となるデバイスの種類を知る必要も気にする必要もなくなりました。従来のオペレーティングシステムでは、プログラマーはレコード構造を強制され、データセマンティクスやデバイス制御はしばしば直交していませんでした。Unixはデータストリームという概念によってこの複雑さを解消しました。データストリームとは、ファイルの最後まで読み取ることができる、順序付けられたデータバイトのシーケンスです。プログラムは必要に応じてバイトを書き込むことができ、バイト数やグループ化を宣言する必要はなく、また簡単に宣言することもできません。
Unixのもう一つの画期的な点は、入力と出力をそれぞれ端末のキーボードとディスプレイにデフォルトで自動的に関連付けたことでした。つまり、典型的な入力処理出力プログラムの場合、プログラム(およびプログラマー)は入力と出力の設定に関して一切何もする必要がなかったのです(別のパラダイムを選択した場合を除く)。これに対し、以前のオペレーティングシステムでは、接続を確立するために複雑なジョブ制御言語が必要となることが多く、あるいは同等の処理をプログラム側で調整する必要がありました。
Unixは標準ストリームを提供していたため、UnixのCランタイム環境もそれをサポートする必要がありました。その結果、ほとんどのCランタイム環境(およびCの派生言語)は、オペレーティングシステムに関係なく、同等の機能を提供しています。
標準入力とは、プログラムが入力データを読み取るためのストリームのことです。プログラムは、read操作を使用してデータ転送を要求します。すべてのプログラムがストリーム入力を必要とするわけではありません。たとえば、dirやlsプログラム(ディレクトリ内のファイル名を表示するプログラム)はコマンドライン引数を受け取りますが、ストリームデータ入力なしで操作を実行します。
リダイレクトされない限り、標準入力は親プロセスから継承されます。対話型シェルの場合、それは通常、端末(または擬似端末)の入力デバイスに関連付けられており、最終的にはユーザーのキーボードに接続されます。
POSIXシステムでは、標準入力のファイルディスクリプタは0 (ゼロ) です。POSIXの<unistd.h>定義は ですSTDIN_FILENO。[ 2 ]対応する C の抽象化は、 (型の) グローバル変数<stdio.h>を介して提供されます。同様に、 C++では、で提供されるグローバルオブジェクト(型の) が、C++ ストリームを介して抽象化を提供します。同様の抽象化は、ほぼすべてのプログラミング言語の標準 I/O ライブラリに存在します。stdinFILE*std::cinstd::istream<iostream>
標準出力とは、プログラムが出力データを書き込むストリームのことです。プログラムは書き込み操作によってデータ転送を要求します。すべてのプログラムが出力を生成するわけではありません。例えば、ファイル名変更コマンド( mv、move、renなどとも呼ばれます)は、成功しても何も出力しません。
リダイレクトされない限り、標準出力は親プロセスから継承されます。対話型シェルの場合、通常はプログラムを起動したテキスト端末から標準出力が引き継がれます。
標準出力のファイルディスクリプタは 1 (1) です。POSIXの<unistd.h>定義は ですSTDOUT_FILENO。[ 2 ]対応する C<stdio.h>変数はstdout(型FILE*) です。同様に C++ では、 で提供されるグローバルオブジェクトstd::cout(型std::ostream) が<iostream>出力ストリームを抽象化します。
標準エラー出力は、プログラムがエラーメッセージや診断情報を出力するために一般的に使用する、もう1つの出力ストリームです。これは標準出力とは独立したストリームであり、個別にリダイレクトできます。
これにより、出力とエラーを区別できる半述語問題が解決され、値のペアを返す関数に類似しています( 「半述語問題」§ 「多値戻り値」を参照) 。通常の出力先は、プログラムを開始したテキスト端末です。これにより、標準出力がリダイレクトされていても(すぐに確認できない場合でも)、表示される可能性が最大限に高まります。たとえば、パイプライン内のプログラムの出力は、次のプログラムの入力またはテキストファイルにリダイレクトされますが、各プログラムからのユーザープロンプトとエラーは、ユーザーがリアルタイムで確認できるように、テキスト端末に直接送信されます。
標準出力と標準エラーをテキスト端末などの同じ宛先に送ることは、許容される通常の動作です。バッファリングが行われない限り、メッセージはプログラムが書き込んだ順序で表示されます。例えば、一般的な状況では、標準エラー出力ストリームはバッファリングされませんが、標準出力ストリームは行バッファリングされます。この場合、標準出力ストリームのバッファがまだ満杯でない限り、標準エラー出力に後から書き込まれたテキストが端末に先に表示される場合があります。
標準エラーのファイルディスクリプタは、POSIX で 2 (2) と定義されています。< unistd.h >ヘッダーファイルではシンボルが提供されていますSTDERR_FILENO。[ 2 ]対応する C変数は(型)<stdio.h>です。同様に、C++ では、このストリームに関連付けられた 2 つのグローバルオブジェクト (それぞれ型) が に提供され、前者はバッファリングされず、後者は他のすべての C++ ストリームと同じバッファリングメカニズムを使用します。stderrFILE*std::cerrstd::clogstd::ostream<iostream>
Bourneスタイルのシェルでは、標準エラーを標準出力と同じ宛先にリダイレクトできます。
2 > & 1
cshスタイルのシェルでは、標準エラーを標準出力と同じ宛先にリダイレクトできます。
> &
標準エラーは、写真植字処理の際にエラーメッセージがユーザー端末に表示される代わりに植字されてしまうという無駄な処理が何度か発生したことを受けて、1970年代にUnixに追加されました。[ 3 ]
ALGOL 60は、標準的なファイルアクセス機能がないことが批判された。
ALGOL 68の入出力機能はまとめてトランスプットと呼ばれていました。[ 4 ]コスターはトランスプット標準 の定義を調整しました。このモデルには、3 つの標準チャネル ( stand in、、stand outおよびstand back)が含まれていました。
C プログラミング言語では、標準入力、標準出力、および標準エラー ストリームは、それぞれ既存の Unix ファイル記述子 0、1、および 2 にアタッチされます。[ 5 ] POSIX環境では、マジック ナンバーの代わりに、<unistd.h>定義STDIN_FILENO、STDOUT_FILENOまたはを使用する必要があります。ファイル ポインタ、、およびも提供されます。STDERR_FILENOstdinstdoutstderr
Ken Thompson (オリジナルの Unix オペレーティングシステムの設計者および実装者) は、バージョン 5 Unixのsort 関数を修正し、標準入力を表すものとして "-" を受け入れるようにしました。この変更は他のユーティリティにも広がり、バージョン 8では特別なファイルとしてオペレーティングシステムの一部となりました。診断情報はバージョン 6まで標準出力の一部でしたが、その後、Dennis M. Ritchie が標準エラーの概念を作成しました。[ 6 ]
C++では、標準ストリームへの書き込みは、当初は<iostream>ヘッダーとそのストリームを使用して行われていましたが、ヘッダーが登場すると<print>、print 関数を使用した入出力が簡素化されました。[ 7 ] C++ は C の I/O 関数にもアクセスできますが、型安全性やカスタム型の拡張サポートがないため、C++ では廃止されていると考えられています。[ 8 ]
#include <iostream> #include <string>std :: stringを使用します。int main () { string input ; std :: cout << "文を書いてください: " << std :: endl ; std :: cin >> input ; int inputLength = input.length ( ); std :: cout << "文: " << input << "、長さ " << inputLength << std :: endl ; std :: cerr << "標準エラー出力に書き込まれた文: " << input << std :: endl ; }C++23では、関数を使用して出力ストリームに書き込むための更新された印刷インターフェースが作成されましたstd::print。[ 9 ]
import std ;std :: stringを使用します。intmain(){strings="Hello, world!";std::println(stdout,"My string: {}",s);std::println(stderr,"String to error stream: {}",s);}Fortran has the equivalent of Unix file descriptors: By convention, many Fortran implementations use unit numbers UNIT=5 for stdin, UNIT=6 for stdout and UNIT=0 for stderr.[10] In Fortran 2003, the intrinsic ISO_FORTRAN_ENV module was standardized to include the named constants INPUT_UNIT, OUTPUT_UNIT, and ERROR_UNIT to portably specify the unit numbers.[11]
! FORTRAN 77 examplePROGRAM MAININTEGER NUMBERREAD(UNIT=5,*)NUMBERWRITE(UNIT=6,'(A,I3)')' NUMBER IS: ',NUMBEREND! Fortran 2003 exampleprogram mainuse iso_fortran_envimplicit noneinteger::numberread(unit=INPUT_UNIT,*)numberwrite(unit=OUTPUT_UNIT,'(a,i3)')'Number is: ',numberend programIn Java, the standard streams are referred to by System.in (for stdin), System.out (for stdout), and System.err (for stderr).[12] It is also possible to read from any input stream using a Scanner.
packageorg.wikipedia.examples;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.util.Scanner;public class Example { 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 . printf ( "Number is: %d%n" , number );//名前と年齢の入力を読み込む: Scanner input = new Scanner ( System.in ) ; System.out.printf ( " %n名前を入力してください: " ) ; String name = input.nextLine ( ) ; System.out.printf ( "%n年齢を入力してください: " ) ; int age = input.nextInt ( ) ; System.out.printf ( "こんにちは、% sさん!あなたは% d歳です。" , name , age ) ; } catch ( IOException e ) { System.err.printf ( "入出力エラー: %s%n" , e.getMessage ( ) ) ; } catch ( Exception e ) { System.err.printf ( "エラー: %s%n" , e.getMessage ( ) ) ; } } }class BASICIO ( LINELENGTH ) ; integer LINELENGTH ; begin ref ( infile ) SYSIN ; ref ( infile ) procedure sysin ; sysin :- SYSIN ; ref ( printfle ) SYSOUT ; ref ( printfle ) procedure sysout ; sysout :- SYSOUT ;class FILE ....................; FILE class infile ............; FILE class outfile ...........; FILE class directfile ........; outfile class printfle .......;SYSIN :- new infile ( " SYSIN " ) ; SYSOUT :- new printfle ( " SYSOUT " ) ; SYSIN . open ( blanks ( 80 )) ; SYSOUT . open ( blanks ( LINELENGTH )) ; inner ; SYSIN . close ; SYSOUT . close ; end BASICIO ;C#やその他の.NET言語では、標準ストリームはSystem.Console.In(stdin の場合)、System.Console.Out(stdout の場合)、System.Console.Error(stderr の場合) で参照されます。[ 14 ] stdin および stdout ストリームの基本的な読み取りおよび書き込み機能は、クラスを介して直接アクセスすることもできますSystem.Console(たとえば、System.Console.WriteLine()の代わりに を使用できますSystem.Console.Out.WriteLine())。
System.Console.In、System.Console.OutおよびはSystem.Console.ErrorそれぞれSystem.IO.TextReader(stdin)および(stdout、stderr)オブジェクトであり、基となる標準ストリームへのアクセスはテキストベースでのみ可能です。標準ストリームへの完全なバイナリアクセスは、それぞれ、およびによって返されるオブジェクトSystem.IO.TextWriterを介して行う必要があります。System.IO.StreamSystem.Console.OpenStandardInput()System.Console.OpenStandardOutput()System.Console.OpenStandardError()
namespace Wikipeda.Examples ;Systemを使用します。public class Example { static int Main ( string [] args ) { try { string s = Console . In . ReadLine (); double number = Double . Parse ( s ); Console . Out . WriteLine ( "Number is: {0:F3}" , number ); } // Parse() で例外が発生した場合catch ( ArgumentNullException e ) { Console . Error . WriteLine ( $"No number was entered: {e.Message}" ); return 1 ; } catch ( FormatException e ) { Console . Error . WriteLine ( $"The specified value is not a valid number: {e.Message}" ); return 2 ; } catch ( OverflowException e ) { Console . Error . WriteLine ( $"The specified number is too big: {e.Message}" ); return 3 ; } catch ( Exception ex ) { Console . Error . WriteLine ( $"An unknown exception occurred: {e.Message}" ); return -1 ; } return 0 ; } }Public Function Main ( ) As Integer Try Dim s As String = System.Console . [ In ] .ReadLine ( ) Dim number As Double = Double.Parse ( s ) System.Console.Out.WriteLine ( " Number is : { 0 : F3 } " , number ) Return 0' If Parse() threw an exceptionCatchexAsSystem.ArgumentNullExceptionSystem.Console.[Error].WriteLine("No number was entered!")Catchex2AsSystem.FormatExceptionSystem.Console.[Error].WriteLine("The specified value is not a valid number!")Catchex3AsSystem.OverflowExceptionSystem.Console.[Error].WriteLine("The specified number is too big!")EndTryReturn-1EndFunctionWhen applying the System.Diagnostics.Processclass one can use the instance propertiesStandardInput, StandardOutput, and StandardError of that class to access the standard streams of the process.
This Python example redirects the standard input both to the standard output and to a text file.
#!/usr/bin/env pythonimportsysfromtypingimportTextIOif__name__=="__main__":# Save the current stdout so that we can revert sys.stdout# after we complete our redirectionstdin_fileno:TextIO=sys.stdinstdout_fileno:TextIO=sys.stdout# Redirect sys.stdout to the filesys.stdout:TextIO=open("myfile.txt","w")ctr : int = 0 for inps in stdin_fileno : ctrs : str = str ( ctr ) # リダイレクトされた stdout に出力します () sys . stdout . write ( f " { ctrs } ) これはリダイレクトされた ---> { inps } \n " ) # 実際に保存された stdout ハンドラに出力しますstdout_fileno . write ( f " { ctrs } ) これは実際の ---> { inps } \n " ) ctr = ctr + 1# ファイルを閉じるsys.stdout.close ( ) # sys.stdoutを以前保存したファイルハンドラに戻すsys.stdout = stdout_filenoグラフィカルユーザーインターフェイス(GUI)は、必ずしも標準ストリームを使用するとは限りません。GUIが基盤となるスクリプトやコンソールプログラムのラッパーである場合は使用します。たとえば、DebianやUbuntuでaptコマンドをラップするSynapticパッケージマネージャGUIなどがそうです。KDEプロジェクト[ 15 ]のZenityやKDialogなどのスクリプトツールを使用して作成されたGUIは、stdin、stdout、stderrを使用し、 Qt、GTK 、またはその他の同等の独自のウィジェットフレームワークを使用してC/C++でプログラムおよびコンパイルされた完全なGUIではなく、単純なスクリプトに基づいています。
NeXTSTEPおよびMac OS Xに実装されているサービスメニューも、標準ストリームに類似しています。これらのオペレーティングシステムでは、グラフィカルアプリケーションは、どのアプリケーションであっても、GUIの現在の選択内容に基づいて動作するシステム全体のメニューを通じて機能を提供できます。
一部のGUIプログラム(主にUnix系)は、デバッグ情報を標準エラー出力に書き込みます。一方、多くのUnix系メディアプレーヤーなど、標準入力からファイルを読み込むプログラムもあります。GUIウィンドウとは別にコンソールウィンドウを開くWindowsの代表的なプログラムとしては、エミュレータのpSXやDOSBoxなどが挙げられます。
GTK-serverは、標準入力をインタプリタ型プログラムとの通信インターフェースとして使用することで、GUIを実現できます。
Common Lispのインターフェースマネージャのパラダイムは、拡張出力ストリームに送信されるGUI要素を「表示」します。
{{cite book}}: CS1 maint: bot: 元の URL の状態が不明です (リンク){{cite book}}: CS1 maint: bot: 元の URL の状態が不明です (リンク)