アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語を学び始めたものです

stdin・stdoutがどのように機能するか分かりません
またstdoutはどこに出力しているんですか

#include <stdio.h>

int main(void)
{
char ch;

while(!feof(stdin)) {
scanf("%c", &ch);
if(!feof(stdin)) printf("%c", ch);
}

return 0;
}

このプログラムは「コンソール」入出力関数だけを使用しテキストファイルの内容を別のテキストファイルにコピーするプログラムだそうですがどのテキストファイルの内容をどこのテキストファイルにコピーしているんですか?stdin・stdoutの機能が全く分かりません。
どなたか分かる方、回答お願いします。

A 回答 (4件)

うろ覚えですが...。


UNIXやMS-DOS(Windowsのコンソールも同じ)などのOSのファイルシステムは、
デフォルトで以下の5つの標準入出力というものを起動時に既にファイルとして開いています。
stdin:標準入力→キーボード
stdout:標準出力→ディスプレイ
stderr:標準エラー出力→ディスプレイ
stdprn:標準印刷→プリンタ
stdaux:標準シリアル入出力→RS232C
これらの標準入出力は、ファイルオープン(fopenやopen)しなくてもすぐに使えるようになっています。
(上記のOSはキーボードや画面、プリンタなどをディスク上のファイルと同じ操作で入出力できるようになっているのが優れたところですね。)

これらの標準入出力のうち、stdinとstdoutはリダイレクトという機能を使って入出力先を切り替えることができます。
リダイレクトはコマンドプロンプトから
prog < file
と実行すると、stdinをキーボードからfileに切り替えます。同様に
prog > file
とすると、stdoutを画面からfileに切り替えます。

したがって、質問のプログラムを例えば、cp.exeという名前でコンパイルすると
cp < infile.txt > outfile.txt
と実行すると、stdinがinfile.txt、stdoutがoutfile.txtとなって、
ファイルがコピーされる訳です。

こんなことができるのも前述したように画面もキーボードもファイルの一種として扱っているからですね。

因みにstderrは、切り替えできないので、
fprintf( stdout, "ファイルへ出力" );
fprintf( stderr, "画面へ出力" );
とすると、リダイレクトを使わずに普通に実行した場合は、両方とも画面に表示されますが、
stdoutをファイルにリダイレクトした場合は、1行目はファイルに出力され、2行目は画面に出力されます。
何かの変換プログラムなどを作る時にエラーが発生した場合のメッセージ表示などで使用します。
    • good
    • 3

OSによります。



OSはなんですか?

UNIXなら、スタンダード入出力がもともと存在し、すごく簡単に言うとキーボードとディスプレイにつながってます。
    • good
    • 2

★『stdin』『stdout』は入出力がいろいろに切り替わります。


・通常、『stdin』はキーボードからの入力ですが、リダイレクション入力があるとその
 デバイスに切り替わります。デバイスとは『装置』のことでファイルやプリンタなどが
 あります。標準入力の『stdin』はキーボード以外では、ファイルをリダイレクション入力
 するのが一般です。
・通常、『stdout』はディスプレイ(画面)の出力ですが、リダイレクション出力されるとその
 デバイスに切り替わります。デバイスは上記と同じですが、標準出力の『stdout』は画面以外
 では、ファイルにリダイレクト出力するのが一般的ですね。
・このことから、『stdin』、『stdout』の標準入出力は、リダイレクションされるかどうかで、
 入力と出力のデバイスが切り替わります。回答者 No.1 さんのコマンドラインは入力側と出力側
 の両方をファイルからの入力と出力に切り替える指定です。
・質問者さんのソースでは、ファイルへの保存(オープン,クローズ)の記述はありませんが、その
 プログラムを実行したときに『リダイレクション』されると、コマンドラインの処理段階で入出力
 ファイルが自動的にオープンされたり、結果を書き込んだ後は自動的にクローズされます。
 このようなプログラムを一般に『フィルタコマンド』などと呼ばれています。MS-DOS コマンドでは
 『TYPE』、『FIND』、『SORT』、『MORE』があります。このようなコンソール・アプリケーションは
 自分でも作ることが可能です。

最後に:
・今回のプログラムは、通常ではキーボードから入力した文字が画面へ出力されます。
 でも、出力をファイルに切り替える(リダイレクト出力する)と入力した文字はそのファイルに書き込まれて
 いきます。また、入力をファイルに切り替える(リダイレクト入力する)と『TYPE』コマンドと同じように
 テキスト内容を画面に出力します。
・組み合わせは次の4タイプがあります。
 (1)入力はそのまま、出力もそのまま
 (2)入力リダイレクト、出力はそのまま
 (3)入力はそのまま、出力リダイレクト
 (4)入力リダイレクト、出力リダイレクト
・以上。おわり。→過去に関連する質問がありました。下の『参考URL』もどうぞ。

参考URL:http://oshiete1.goo.ne.jp/qa2753651.html
    • good
    • 0

stdin → 標準入力


stdout → 標準出力
です。
一般には標準入力はキーボードでタイプしたものですし、
標準出力はコンソール画面ですが、「リダイレクト」を行うことにより
ファイルなどに変更することができます。

提示されているプログラムを見ると標準入力から
受け取ったものを標準出力に送っているだけで
このプログラム自体ではファイルへの書き込みはしていません。


c:\hoge> hoge.exe < file1 > file2

のように使うプログラムじゃないかと思うのですが
その辺のことは何も書いてありませんか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!