【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.22731

stdin、stdout、stderrの使い方について
投稿者---仁(2005/08/18 19:38:26)


stdin(標準入力)、stdout(標準出力)、stderr(標準エラー)の使い方
について教えて下さい。

stdinは、キーボードからの入力。
stdoutとstderrは、スクリーン(ターミナル接続画面)に出力。
つまりは、stdin、stdoutを使用すると、fopen、fclose、fprintfを使用しなくても
ファイルへの読み書きができるということでしょうか。

# a.out < in_file.txt > out_file.txt
とすると
in_file.txtの内容が、out_file.txtに出力される。


#include <stdio.h>

main(int argc,char *argv[])
{
  char buf[256] ;

  while (fgets(buf, sizeof buf, stdin)) {
      do {
          fputs(buf, stdout) ;
      } while (fgets(buf, sizeof buf, stdin) != NULL) ;
      fputs("\n", stdout) ;
  }
}



出力なのですが、stdoutとstderrはどちらを使っても同じなのでしょうか。
stderrは、標準エラー出力ということでコンソールにも出力されるのでしょうか。
やはり、用途に応じた使い方がいいのでしょうか。

抽象的というか曖昧な質問ですみません。




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:stdin、stdout、stderrの使い方について 22733 まきじ 2005/08/18 20:16:50
<子記事> Re:stdin、stdout、stderrの使い方について 22734 REE 2005/08/18 20:17:26
<子記事> Re:stdin、stdout、stderrの使い方について 22736 RAPT 2005/08/18 20:27:49
<子記事> Re:stdin、stdout、stderrの使い方について 22740 RiSK 2005/08/18 22:31:45
<子記事> Re:stdin、stdout、stderrの使い方について 22743 2005/08/19 00:53:31


No.22733

Re:stdin、stdout、stderrの使い方について
投稿者---まきじ(2005/08/18 20:16:50)


>つまりは、stdin、stdoutを使用すると、fopen、fclose、fprintfを使用し>なくてもファイルへの読み書きができるということでしょうか。

標準入力、標準出力を変えればできます。

>a.out < in_file.txt > out_file.txt

「< in_file.txt」 で 標準入力は in_file.txt となり
「> out_file.txt」 で標準出力で out_file.txt となります。

>出力なのですが、stdoutとstderrはどちらを使っても同じなのでしょうか。
>stderrは、標準エラー出力ということでコンソールにも出力されるのでしょうか。

標準出力、標準エラーは、ディスプレイやプリンタなど装置に設定されています。
設定が変われば、出力先も変わります。

stdin stdout stderr は環境により異なります。


この投稿にコメントする

削除パスワード

No.22734

Re:stdin、stdout、stderrの使い方について
投稿者---REE(2005/08/18 20:17:26)


>つまりは、stdin、stdoutを使用すると、fopen、fclose、fprintfを使用しなくても
>ファイルへの読み書きができるということでしょうか。

stdin,stdout,stderrはfopen済みで、fcloseの必要の無いファイルと考えてください。

fprintfについては、今回の件とは無関係です。
もともと必要なければ、使う必要はありません。

>出力なのですが、stdoutとstderrはどちらを使っても同じなのでしょうか。

違います。

>stderrは、標準エラー出力ということでコンソールにも出力されるのでしょうか。
>やはり、用途に応じた使い方がいいのでしょうか。

stderrを使ってみれば分かりますが、
> # a.out < in_file.txt > out_file.txt 
では、stderrに出力したものは、out_file.txtには書かれず、画面にだけ表示されます。

通常は、stderrはこういう用途(リダイレクトの有無に関わらず、画面に表示したい場合)に使います。

# 実際には、stderrの内容もリダイレクト出来る場合も有りますが・・


この投稿にコメントする

削除パスワード

No.22736

Re:stdin、stdout、stderrの使い方について
投稿者---RAPT(2005/08/18 20:27:49)


OSのリダイレクト機能と、C言語の識別子 stdin,stdout,stderr との
直接の連関はありません。
# リダイレクトのデータがある場合、stdinを経由して読むことができる
# とかいうことではなく。

stdinの入力元、stdout, stderr の出力先がどのデバイスであるかは環境依存です。

Windows系では、デフォルトのstdoutとstderrはコンソール画面を示している
事が多いでしょうが、
> foo.out >normal.log
としてもstderrは画面に出力されます。

Linux等では、リダイレクトで通常の出力とエラー出力とを分けることができます。
$ foo.out >normal.log 2>error.log

あくまで環境の「標準」で定められているデバイスが対象となります。
# 環境によっては、その「標準」のデバイスを変更することもできますので。

※下記の2つは等価です。
printf("書式文字列", ...);
fprintf(stdout, "書式文字列", ...);

仮にお使いの環境で同じ結果であるように見えるとしても、
stdout,stderrを同列に扱うのは止めた方が良いです。
移植性が低くなりますし、ソースを見たときに誤解する恐れがあります。

stdin, stdout, stderrはヘッダを見れば分かるかと思いますが、
標準定義でオープン済かつ閉じる必要の無いFILE* 型の変数です。



この投稿にコメントする

削除パスワード

No.22740

Re:stdin、stdout、stderrの使い方について
投稿者---RiSK(2005/08/18 22:31:45)


余談です。

stdin, stdout, stderr は freopen を使って,差し替えることもできます。
std* + freopen はデバッグに使えますよん。

しかし,それらを freopen によって,一度クローズしてしまうと,
プログラム中で元に戻せない可能性が高いので注意です。


この投稿にコメントする

削除パスワード

No.22743

Re:stdin、stdout、stderrの使い方について
投稿者---仁(2005/08/19 00:53:31)


まきじさん、REEさん、RAPTさん、RiSKさん
解説及びアドバイスありがとうございます。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧