![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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件)
- 最新から表示
- 回答順に表示
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行目は画面に出力されます。
何かの変換プログラムなどを作る時にエラーが発生した場合のメッセージ表示などで使用します。
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
No.1
- 回答日時:
stdin → 標準入力
stdout → 標準出力
です。
一般には標準入力はキーボードでタイプしたものですし、
標準出力はコンソール画面ですが、「リダイレクト」を行うことにより
ファイルなどに変更することができます。
提示されているプログラムを見ると標準入力から
受け取ったものを標準出力に送っているだけで
このプログラム自体ではファイルへの書き込みはしていません。
c:\hoge> hoge.exe < file1 > file2
のように使うプログラムじゃないかと思うのですが
その辺のことは何も書いてありませんか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VC++でUTF-8のファイルを出力し...
-
Accessでのレポート印刷待機方法
-
pcap形式データをテキストへ抽出
-
csvファイルでの出力について
-
pLaTeX の EPSファイル読み込み...
-
C言語 ドラッグとファイル名の表示
-
アプリケーションのログファイ...
-
井戸型ポテンシャルの数値解シ...
-
C++/CLIにて、System.String^型...
-
コマンド(例えばls)の出力結果...
-
VBSでEXCEL⇒CSV変換で日付の書...
-
ドキュワークスでPDFファイルを...
-
コマンドライン引数の区別【C言...
-
visual c++でutf-8の扱い
-
ラストです!! このプログラム...
-
MATLABのCSV形式での書き込みに...
-
絶対パスをクリップボードへコピー
-
CADの無い環境の得意先に図面を...
-
Acccess レポートをグループ別...
-
構造体のファイル出力
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Paiza Cloudです。 どうやれば...
-
Paiza Cloudです。学籍番号と氏...
-
Acccess レポートをグループ別...
-
ファイル出力の場所を指定
-
コマンド(例えばls)の出力結果...
-
VC++でUTF-8のファイルを出力し...
-
テキストファイルに改行コード...
-
シェルコマンドの 2>&1 とはど...
-
VBA でメモ帳へ保存する際の保...
-
ファイル形式またはファイル拡...
-
fortranのtxtファイル出力書式...
-
CSV形式に変換
-
printfだと出力されるのにfprin...
-
C++ fprintf_sの使い方がわからん
-
c言語の質問です。 ランダムに4...
-
Wordマクロで指定したフォルダ...
-
C++/CLIにて、System.String^型...
-
pcap形式データをテキストへ抽出
-
二次元配列をクリップボードに...
-
raw形式からbmp形式への書き込...
おすすめ情報