あなたが本質的に言うことは次のとおりです。
コンソールには通常、 と の 3 つの標準ストリームstdin
がstdout
ありstderr
ます。これらのストリームはリダイレクトできます。Windows を使用している場合は、redirectionも参照してください。
と言うとき./my_prog > test.txt
、コンソールに (ではなくmy_prog
) 伝えることは、書き込みをファイルにmy_prog
書き込むことです。stdout
test.txt
コードで ie と言うとprintf("Hello");
、Helloがファイルに書き込まれますtest.txt
。
./my_prog < test.txt
代わりに言ってリダイレクトを好転させた場合は、次のようになります。ファイル test.txt を my_prog にストリーミングします。これにより、 test.txtにテキストがあった場合、test.txt が text.txt にコピーされます。
コードで次のように言います。
int main(void)
{
int ch;
FILE *input;
/* Here you open a handle to the file text.txt for reading and writing */
input = fopen("text.txt", "w+");
while ((ch = getchar()) != EOF) { /* get next char from stdin */
fputc(ch, input); /* write that char to the handle input */
}
fclose(input); /* close the handle */
return 0;
}
したがって、実行方法は次のとおりです。
あなたのコードで:
- text.txt を開く
- 入力待ち (標準入力に入力されたデータ) - 通常、ユーザーがコンソールにテキストを入力し、Enterが押されたときにプログラムに渡されます。
コンソールで:
my_prog
からすべてを test.txt にリダイレクトします。
あなたは言う:
スクリプトが EOF に達しない
それから読み取ると、stdin
(例外なく) 2 つの条件下でのみ EOF が取得されます。
ファイルをプログラムにリダイレクトする場合。すなわち./my_prog < foo.txt
(通知<
、ではありません>
)。
- その場合my_prog
、ファイルからデータを読み取り、foo.txt
そのファイルが終了すると、プログラムは EOF を受け取ります。そして、それゆえにやめてください。
に EOF を手動で入力すると、stdin
.
- Linux および OSXの場合Ctrl- D、Windows の場合Ctrl-Z
ここで、コンソールにテキストを入力してこれをテストする場合は、次のような書き込みアクションfputc()
がバッファリングされることを思い出してください。これが意味することは、データがすぐにファイルに書き込まれるのではなく、特定の量のデータがバッファにある場合、fflush()
呼び出された場合、ストリームが閉じられた場合、バッファリングをオフにした場合などにのみ書き込まれるということです。
また; プログラムを実行すると。テキストを入力し、さらにテキストを入力してから、Ctrl-Cを押してプログラムを中止しますtext.txt
。
これは、プログラムが強制終了されてfclose()
呼び出されないため、ファイルにフラッシュされないためです。
プログラミングをさらに進めていく上で、何も推測しない習慣を身につけることは非常に良い考えです。fopen()
つまり、OK であるとは限りません。
FILE *fh;
char *outfile = "foo.txt";
if ((fh = fopen(outfile, "w")) == NULL) {
fprintf(stderr,
"Unable to open file %s\n --",
outfile);
perror(" fopen() ");
return 1;
}
ほとんどの関数には、操作が成功したかどうかを確認する方法があります。すなわち:
if (fputc(ch, fh) != ch) { err ...
これにより、コードがより安全になり、どこで失敗したかなどのヒントが得られます。
いくつかのリンク: