私は、標準入力Cの内容を読み取って出力するテスト プログラムの作成を任されました。
しかし、少し疑問があります。標準入力とは正確には何ですか?
キーボードで入力したものですか?それは私が読まなければならないファイルですか?
両方とも?
そして同じstandard outputことが言えます:それはコンソールですか?ファイル?
C 標準 (C99 や C11 など) は、(適切に-d した<stdio.h>後) 標準ヘッダーから期待されるものを定義します。stdio(3)の man ページ#includeを参照してください。次に、andおよびファイル ハンドル (抽象データ型である some へのポインター) があります。stdinstdoutstderrFILE
stdin一部のデバイス (キーボードなど) に関連するという事実は、実装固有です。
コンピューターを使用する代わりに、たとえば人間の奴隷の部屋を使用して C 標準を実装することもできます (ただし、非倫理的および/または非効率的です)。多くの場合、コンピューターはオペレーティング システムの助けを借りて C 標準の実装を提供します。
C プログラム内で、stdinが「キーボード」なのか、「ファイル」からリダイレクトされたのかを知りたい場合があります。残念ながら、知る限り、それを知るための C99 標準の方法はありません。
あなたが言及したように、、stdinおよびstdout起動stderr時にプログラムで利用できるはずです(つまり、入力した後main....)。したがって、ストリームでない限りfclose、事前の注意を払わずに ( 、 、 、 ... と友達と) 読むことができます (自分で読む必要はありませんstdin) 。getcharscanfgetlinefgetsfscanffopen
Linux またはほとんどの Posix システムでは、概算として使用できます(isatty(STDIN_FILENO)詳細についてはisatty(3)を参照してくださいstdin)。this & thatも参照してください。
標準出力(またはstdout) は、Linux やその他の Unix ライクなオペレーティング システムのコマンド ライン プログラム (つまり、すべてテキスト モードのプログラム) によって生成されるデータの標準化されたストリームを指します。
stdin はファイル記述子 0 です。次の方法で stdin にファイルを取得できます。
cat file |yourprog
#or
yourprog <file
stdout についても同様 (ファイル記述子 1)
yourprog | someotherprog #pipe your stdout to the stdin of another program
yourprog > somefile #save stdout to a file
yourprog >> somefile #append stdout to a file
および stderr (fd 2)
yourprog 2> errlogfile
ファイルを受け取るが stdin を処理しないプログラムがある場合は、これを行うことで上記の形式を使用できます (入力ファイル引数の場合は -f を想定)。
myprog -f /dev/stdin
//and a horrible example of how not to read from stdin and write to stdout
char buf[4096];
while(write(1,buf,read(0,buf,4096)));