私は、標準入力C
の内容を読み取って出力するテスト プログラムの作成を任されました。
しかし、少し疑問があります。標準入力とは正確には何ですか?
キーボードで入力したものですか?それは私が読まなければならないファイルですか?
両方とも?
そして同じstandard output
ことが言えます:それはコンソールですか?ファイル?
C 標準 (C99 や C11 など) は、(適切に-d した<stdio.h>
後) 標準ヘッダーから期待されるものを定義します。stdio(3)の man ページ#include
を参照してください。次に、andおよびファイル ハンドル (抽象データ型である some へのポインター) があります。stdin
stdout
stderr
FILE
stdin
一部のデバイス (キーボードなど) に関連するという事実は、実装固有です。
コンピューターを使用する代わりに、たとえば人間の奴隷の部屋を使用して C 標準を実装することもできます (ただし、非倫理的および/または非効率的です)。多くの場合、コンピューターはオペレーティング システムの助けを借りて C 標準の実装を提供します。
C プログラム内で、stdin
が「キーボード」なのか、「ファイル」からリダイレクトされたのかを知りたい場合があります。残念ながら、知る限り、それを知るための C99 標準の方法はありません。
あなたが言及したように、、stdin
およびstdout
起動stderr
時にプログラムで利用できるはずです(つまり、入力した後main
....)。したがって、ストリームでない限りfclose
、事前の注意を払わずに ( 、 、 、 ... と友達と) 読むことができます (自分で読む必要はありませんstdin
) 。getchar
scanf
getline
fgets
fscanf
fopen
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)));