• ベストアンサー

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

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

noname#113783
noname#113783

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

  • ベストアンサー
  • 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などはその標準入出力を扱っている関数なんですね。ストリームは流れで、入出力は概念ということです・・・ね?成るほど。よくわかりました。回答ありがとうございました!

関連するQ&A

  • ストリームについて具体的に

    ストリームは入出力装置へのアクセスのための情報を抽象化した抽象データ型だそうですが(Wikipediaより)、それは具体的にどうなっているのですか?FILE構造体のようなものでしょうか。 ・ストリームにはどんな情報が入っているのですか? ・ストリームはどこに展開されているのですか?メモリでしょうか。 あと、プログラミングは初心者なのでチンプンカンプンな質問をしているかも知れません。その場合は「何か勘違いしてますよ~」と指摘してくださると嬉しいです。回答お待ちしています。

  • ファイルを開く、ストリームを結びつける、とは?

    C言語の標準関数の説明の中に、 「ファイルを開く」 「ストリームと結びつける」 といった表現がでてくるのですが、これはどういう意味ですか? freopenを理解しようとしていたのですが・・・。 ファイルを開くとはFILE構造体を展開する?ファイルディスクリプタをシステムに登録する?・・・意味がいまいち掴めません。「ストリームと結びつける」も同様です。 これらは具体的にどういう意味なのでしょうか?回答よろしくお願いします。

  • 標準入力について

    ユーザーからの入力した情報を受け取るのにSTDINを使い標準入力から次の行まで読み込まれるとあるのですが、一体、どの範囲からどの範囲まで読み込まれるのか良く分かりません。 ユーザーから入力された情報を全て受け取ると言う意味でしょうか? よく分かりません、教えて下さい。

  • Excel2007 標準偏差

    標準偏差を求める関数はSTDEVPで良いのでしょうか。 また、データが0が29個、10が2個あった場合、平均は0.64516129、標準偏差は2.456701002になりますでしょうか。 この標準偏差2.456701002は何を意味するのでしょうか。 これを見て、考察できることはあるのでしょうか。

  • 標準入出力

    ImageMagickのcompositeコマンドなどで、標準入力から複数の画像データを渡したいのですが、具体的にどのようにすればよいのかわかりません。 ImageMagick関連のモジュールがインストールされていないため、実行関数で利用したいのです。 よろしくお願いします。

    • 締切済み
    • PHP
  • fflush()、setbuf()について

    C言語にお詳しい方、ご回答お願いします。 fflush関数は、「バッファに格納されているデータを吐き出す。」とあるのですが、具体的にどのような動作をするのでしょうか? (1)fflush(stdin),fflush(stdout)とそれぞれ記述するとどのような動作をするのか。 (2)データをフラッシュしたいときとは、具体的にどんなときか。(scanfなどで続けてデータの入力を行うこと以外に) setbuf関数は、「出力バッファをユーザバッファに指定」とあるのですが、具体的にどういう意味なのでしょうか? (1)setbuf(stdout,buf)、setbuf(stdin,buf)とそれぞれ記述するとどのような動作をするのか。 よろしくお願いします。

  • 複数のデータストリーム?

    MS-Word のファイル(NTFS上)をUSB メモリにコピーしたところ、 「ストリーム損失の警告:このファイルには、いくつかのデータストリームが含まれていますが、対象のボリュームはこの機能をサポートしません。そのため、データによっては保存されないものがあります。」 というメッセージが出ます。 ネットで調べると、  プログラマから見た NTFS 2000 Part1: ストリームとハード リンク  http://www.microsoft.com/japan/msdn/windows/windows2000/ntfs5.asp このページに情報が書いてありました。いまいち理解し切れてないのですが。。 今のところ、ワードのファイルをUSBメモリにコピーした後、実害はなさそうなのですが、結局のところ、 (1)気にしなくて良いのでしょうか? (2)気にすべきなのは、どのようなワードファイルを作ったときなのでしょうか? おそらくプログラマでないと分からないと思ったので、このカテゴリに出させていただきました。

  • 標準偏差の意味がわかりません

    標準偏差の意味がわかりません。 1  平均との差を求め 2 それを2乗して 3 その総和を求めて 4 データ数で割って 5 その平方根 以上が一般的な標準偏差の説明の説明のようですが、4、5が入れ換わり . . 3 その総和を求めて 4 その平方根 5 その平方根をデータ数で割る ならば標準偏差の値の意味が理解できるのですが? 数学に疎い私でも理解できるような説明をお願いします。 ネット上も探したのですがよくわかりません。

  • 標準入力からデータを受け取ってランダムファイル処理させたい

    LINUXでCを使っています。 catでデータを標準出力させ、データ解析プログラムで標準入力から受け取り、そのデータをfseek関数を使ってランダム処理させようとしているのですが、うまくいきません。 具体的には、入力データをfseek関数でファイルポジションを一字分戻らせる処理をさせようとしています。でも、標準入力からデータを受け取るとfseekでファイルポジションを戻してやろうとしても戻りません。 fseekを使うには、一度データをファイルに落とし、fopenで開けてやるしか方法がないのでしょうか?

  • C言語のprintf()関数の「f」の意味

    標準入出力関数のprintfの意味が分かりません。 「print」は印刷だと思いますが、「f」は何なのでしょうか? 詳しい方がいましたら、よろしくお願いします。

専門家に質問してみよう