• ベストアンサー

標準ストリームが理解できません

標準ストリームの意味が理解できず困っています。 色々なサイトを回って調べてみたのですが、あるサイトではデータが通る経路だと書かれていたり、またあるサイトでは入出力装置から情報を受け取ったり情報を渡したりするということだ、と書かれていたりなにが正しいのかさっぱりです。 普通に標準入出力関数とかは使ってきましたが、stdin等は理解しておく必要がありますよね?標準ストリームは具体的にどういう物か教えていただけたらうれしいです。回答お待ちしています。

質問者が選んだベストアンサー

  • ベストアンサー
  • oldman50
  • ベストアンサー率29% (8/27)
回答No.2

「振り返ってみると、私がベル研究所でUNIXに触れたのが1975年、日本への初めての導入契約を結んだのが1976年、そして実際に手元のミニコンでUNIXを使い始めたのが1977年だったから、かれこれ10年になる。この間にUNIXは大幅に強化され、一段とすぐれたOSになったが、驚いたのは、UNIXが当初誰も予想しなかったほどに普及しつつあることである。 ・・・  本書は、主として、1979年以後の32ビット型コンピュータ向けのUNIXに関する論文を集めたものになっている。これらの論文の中で、最近までの実用化と関連の深いテーマをあげると、ビットマップ・ディスプレイ端末Blit、C++プリプロセッサ、IBM大型機UNIX、それにUNIXの開発者であるRitchieのストリーム入出力などがある。 ・・・  このうちBlitについては、先日ベル研を訪ねて、Ritchie氏やKernighan氏らに会ったときに、彼らが実際にBlitマルチウィンドウを通してUNIXを使う様子をじっくりと見せてもらった。とくにユーモラスで面白かったのは、Blit端末を使用している間に、誰かからのメイルが届くと、発信者の小さな顔写真が画面の上に表示されることと、顔写真が登録されていない人の顔は黒メガネのギャング風のパターンとして表示されることである。文字ディスプレイではこんな芸当はできない。 ・・・  私が最後にあげたRitchieのストリーム入出力のアイデアは、1986年6月に発表されたシステムVのリリース3.0で見事に花開いた。3.0の入出力やネットワーク機能を抽象化して、ハードウェアやプロトコルとは独立な形で応用プログラムを書くことも可能にするため、ストリーム方式が全面的に採用されているからである。従来のUNIXの特徴のひとつだったパイプライン機構では、データの流れは一方向に限られているが、ストリームでは、データは双方向に同時に(全二重的に)流せる。今後のプログラマにとっては、パイプラインと並んで、ストリームについての理解は恐らく必須になることであろう。」 (「UNIX原典」(AT&Tベル研究所編/長谷部紀元, 清水謙多郎 訳、1986年パーソナルメディア刊)監修者まえがき(石田晴久)より)  ストリームは抽象的な概念であり、それを心底納得するのはなかなか難しいと思います。 ストリームと言われると、何となくイメージ化して捉えないと落ち着かないところがありますが、ストリームとは入出力用ファイルポインタの別名だと割り切って、先に進む方が良いのではないかと思います。  どうしても納得したいと言う場合は、抽象的な概念なので、その概念を考え出したデニス・リッチー(UNIXとC言語の創造主)本人による原論文を読むのが一番良いと思います。内容は高度で難しいですが、分からなくても読んでみると、読んでいくうちに、なるほど!と深い理解が得られます。 「ストリームとは、ユーザ・プロセスとデバイスまたは擬似デバイス間の全二重結合のことである...」 (A Stream Input-Output System. by D.M.Ritchie)

noname#113783
質問者

お礼

ストリームはこういうもの!という物ではないんですね。初めの内はstdinという名前から想像して関数的な何かかな?と思っていました(アホすぎる・・・)。stdin等が理解できなかったのですが、 >>ストリームとは入出力用ファイルポインタの別名 でMSDNに書いてあったstdinの解説の意味がわかりました。 回答ありがとうございました!

その他の回答 (1)

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.1

"標準ストリーム"という概念の背後には、 プログラムに対してある"モデル"が存在します。 プログラムとは "入力を受け取り、処理をして、出力をするものだ" というモデル(考え方)です。 たとえば、 入力データを受け取って、 並び替えて 出力する という感じです。 これは 入力 ==> (処理) ==> 出力 へとデータが流れていく という風に考えることもできます。 この”流れ"をストリームと言います。 ストリームとはあまりに抽象的です。 実際に使う際には どこから”入力"して どこへ"出力"するか を決めなければなりません。 元々、コンピュータはタイプライターのような使われ方をしてきました。 タイプライタは紙に出力しますが、 コンピュータの場合は”ディスプレィ"に出力します。 入力装置はともにキーボードです。 この場合、データは、キーボードから入力され、ディスプレイに出力されます。 キーボード ==> (処理) ==> ディスプレィ と流れます。 これが最も基本的な流れなので "標準ストリーム" と呼ばれます。 この場合 キーボードは"標準入力" ディスプレィは"標準出力" と呼ばれます。 コンピュータは、タイプライタよりはるかに賢いので、 入力はキーボードに限りません。 ファイルから読み込ませることも可能です。 また出力先も同様に ファイルやプリンタに切り替えることができます。 このように標準の入出力先を切り替えることを "リダイレクト" と呼びます。 また、ある処理の出力を別の処理の入力にすることも可能です。 例えば 処理1) "A"で始まるファイルをリストアップする 処理B) ファイルの大きさTOP10を表示する という2つの処理があったとします。 これらは、元々別の処理としてあり、独立して使われます。 しかし、処理Aの出力を処理Bに"そのまま流す"ことで "A"で始まるファイルの大きさTOP10を表示する ことが可能です。 この様にある処理結果を次の入力に"そのまま流す" ことを"パイプ"と呼びます。 パイプはいくつもつなげることができます。 こうすることで、 ”シンプルな処理を組み合わせて、複雑な処理を行わせる" ことが可能になります。 このことは、 プログラミングの基礎となっています。

noname#113783
質問者

お礼

ではprintfなどはその標準入出力を扱っている関数なんですね。ストリームは流れで、入出力は概念ということです・・・ね?成るほど。よくわかりました。回答ありがとうございました!