• 締切済み

stdin,stdoutについて

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の機能が全く分かりません。 どなたか分かる方、回答お願いします。

みんなの回答

  • higeG
  • ベストアンサー率22% (4/18)
回答No.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行目は画面に出力されます。 何かの変換プログラムなどを作る時にエラーが発生した場合のメッセージ表示などで使用します。

  • precog
  • ベストアンサー率22% (966/4314)
回答No.3

OSによります。 OSはなんですか? UNIXなら、スタンダード入出力がもともと存在し、すごく簡単に言うとキーボードとディスプレイにつながってます。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.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
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

stdin → 標準入力 stdout → 標準出力 です。 一般には標準入力はキーボードでタイプしたものですし、 標準出力はコンソール画面ですが、「リダイレクト」を行うことにより ファイルなどに変更することができます。 提示されているプログラムを見ると標準入力から 受け取ったものを標準出力に送っているだけで このプログラム自体ではファイルへの書き込みはしていません。 c:\hoge> hoge.exe < file1 > file2 のように使うプログラムじゃないかと思うのですが その辺のことは何も書いてありませんか?

関連するQ&A

  • 意味のよく分らないソース

    http://oshiete1.goo.ne.jp/qa2846277.html 上のURLのソースについていくつか質問です。 while(!feof(stdin)) { scanf("%c", &ch); if(!feof(stdin)) printf("%c", ch); } と、書いてありますが、「!feof(stdin)」のようにいきなりエクスクラメーションマー ク(ビックリマーク)が付いていますが、これはどの様な意味になるのでしょうか? また、whileでstdinを回しているようですが、stdinはどのタイミングにどの様に入力し ているのでしょうか? ANo.4の方がcp.exeというファイル名でこのプログラムをコンパイルしたら、「cp < infile.txt > outfile.txt」と入力すると、infile.txtの内容をoutfile.txtへコピーで きると書いてあるのですが「<■■■■■>」のように「<」と「>」のマークでくくって いるのはどういう意味になるのでしょうか?

  • fflush(stdin)の使い方とprintf()関数getchar()関数の違いについて

    はじめまして。 現在c++を勉強し始めて1週間の初心者です。 fflush(stdin)について質問です。下記のプログラムで小文字入力したアルファベット1文字を大文字に変換して出力しています。方法(1)ではgetchar()関数とputchar()関数を使用していますがどうしてこの場合にはfflush(stdin)が必要となり、方法(2)のprintf()関数とscanf()関数を使用した場合はfflush(stdin)が必要ないのでしょうか?どなたか私のような初心者でも分かるように詳しく説明してもらいたいです。 何故かプログラムを書いているとprintf()とscanf()がよく混乱します。原因として、printf()を先に書く場合と、scanf()を先に書く場合が有るからだと思っているのですが、まだよく理屈の理解ができません。なので出来ればこれらの関数についても基本的な概念を教えていただきたいです。それと方法(2)では何故最後にscanf(%c):が無くても良いのかも良く理解できません。 どなたか是非とも回答宜しくお願いします。 #include <stdio> main void() { 方法(1) printf("\n文字を1つ入力してください:"); fflush(stdin);    char ch=getchar(); ch=ch-32; putchar(ch);    方法(2) printf("\n文字を1つ入力してください:") //fflush(stdin);必要なし???    char ch; scanf("%c",&ch); ch=ch-32; printf("%c",ch);    //scanf(%c):??? }

  • gccコンパイラのエラーについてstdin

    画像を変換するCプログラムを作成し、cygwinのgccでコンパイルしようとしたところ 以下のエラーが出て困っています。 $ gcc conv.c In file included from conv.c:24:0: conv.c: 関数 ‘main’ 内: conv.c:78:18: エラー: expected ‘)’ before ‘->’ token extern FILE *stdin; ^ conv.c:79:18: エラー: expected ‘)’ before ‘->’ token extern FILE *stdout; ^ conv.c:80:18: エラー: expected ‘)’ before ‘->’ token extern FILE *stderr; 24行目で、#include <stdio.h>を記述しております。 なにが原因でしょうか?

  • /dev/stdin

    /dev/stdin/ の利用価値を教えてください。 いまいちありがたみがわからないのです。 cat /dev/stdin と入れてみて、「a」と入力すると同じ文字が次の行で表示されました。 #cat /dev/stdin a ←自分で入力 a ←自動で表示された。 ★実行プログラムが標準入力や標準出力に対応していなくでもファイル名を指定するときに これらのファイルを指定することで、標準入出力に対応できます。 パイプやヒアドキュメントをつかって便利に使えるようになりますよ。 というblog記事も見つかったのですが いまいち、ピンと来ないのです。 /dev/stdin を使うとどんなメリットがあるのでしょうか ご教授お願いします。

  • コンソールを監視したい

    miracle linux を使用しています。 C言語system関数でrxvtを立ち上げて、コンソール画面に数分間なんの入出力がなければ、終了させる。という事をさせたいのですが、なにか方法はないでしょうか? そもそもsystem関数で立ち上げたrxvtのstdin,stdoutを監視する事が可能なのでしょうか? もし可能でなければ、他の方法でコンソールを立ち上げ、監視する方法があるのでしょうか? どなたか、知っていらしたらご教授していただけたら幸いです。 宜しくお願い致します。

  • doループ内での scanf

    Visual C++ win32 console application でC言語の勉強をしています 制御文に入ったところで、scanf文が無視され、プログラムが進んでいく という事態に直面して困っています。 どなたか下記のプログラムの間違いを指摘してください あるいは  言語仕様についてご教示ください 以下、まるまるコピーします #include<stdio.h> int main(void) { int g; char ch; do{ printf("何ガロンですか?: "); scanf("%d", &g); printf("%.2fリットルです\n", (3.7854)*g); printf("また計算しますか?Y/N : "); scanf("%c", &ch); printf("%c\n", ch); }while(ch == 'Y'); return 0; } よろしくお願いします。長文失礼しました

  • %sの使い方について教えてください。

    %sの使い方について教えてください。 char c[4] = "abc" printf("%s",c); この関数は%sでcのアドレス(&c[0])を読み込み、stdoutにそのアドレスを書込み、文字列abcが表示されると認識しています。 printf("%s",stdin); とすればstdinのアドレスがstdoutに書き込まれて標準入力が表示されると思っていたのですが、実際はprintf("%s",*stdin)としなければ出力されませんなぜでしょうか? 回答をよろしくお願いします。 もう一つ別件なのですが、printf("%d",sizeof *stdin); と入力すると、32と出力されます。 なので、stdinは32バイトの大きさだと認識したのですが、char型の文字が32文字以上を書き込むことができます。(scanf()で入力が失敗して32文字以上の文字をバッファに保管できるということです。) これはどういうことでしょうか、分かる方是非、回答をよろしくお願いします。

  • C++ ファイルの入出力

    C++ ファイルの入出力 テキストファイル(ノートパッド)の入出力について勉強しています。プログラムを一通り書いてデバッグした所、何のエラーもありませんでした。しかしテキストファイルを開くことができません。ファイルが存在しないときのために「I/O error」のメッセージを表示するようにしてあるんですけど、プログラムを動かすとそのメッセージが出ます。自分の書いたプログラムが悪いのかと思い、教科書にある例題をコピーして動かしても同じ結果です。プログラム自体は何の問題ないのにテキストファイルがリンクしません。ちなみにファイルの場所は指定していません。なのでcppファイルがあるところと同じところにテキストファイルを置いています。これで動くはずなんですが動きません。どこにテキストファイルを置けばいいのでしょうか?もし必要なら私が書いたコードも載せます。回答よろしくお願いします。

  • ちょっとした疑問なんですが・・・(C言語)

    何度も質問してごめんなさい! ちょっとした疑問なんですが、下記のプログラム中の、 while(!feof(in)) { ch = fgetc(in); if(!feof(in)) fputc(~ch, out); } のコードで、「while(!feof(in))」でストリーム「in」結び付けられているファイルの終わりに達していれば繰り返し処理を終えるのは分かるのですが、 なぜ、インクリメントも無くファイルの終わりまで文字を調べ進めることができるのでしょうか? 未熟者の私ですが教えて頂けないでしょうか? 【プログラム例】 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *in, *out; unsigned char ch; if(argc!=3) { printf("使用法: <プログラム名> <入力ファイル名> " "<出力ファイル名>\n"); exit(1); } if((in = fopen(argv[1], "rb"))==NULL) { printf("入力ファイルを開くことができません\n"); exit(1); } if((out = fopen(argv[2], "wb"))==NULL) { printf("出力ファイルを開くことができません\n"); exit(1); } while(!feof(in)) { ch = fgetc(in); if(!feof(in)) fputc(~ch, out); } fclose(in); fclose(out); return 0; }

  • fflush()、setbuf()について

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

専門家に質問してみよう