0

C で fputc を使用する方法についての基本的な理解を得ようとしています。そこにあるいくつかのドキュメントを読み、それが正しいと信じていました。しかし、作成したスクリプトを使用しようとするたびに、 . /fputc > test.txtを実行します。ここで、text.txtは 1 行のテキストを含むテキスト ファイルです。

これは私のスクリプトです:

int
main(int argc, char **argv){
    int ch;
    FILE *input;
    input = fopen("text.txt", "w+");
    while ((ch = getchar()) != EOF){
        fputc(ch, input);
    }
    fclose(input);

    return 0;
}

コンパイル時にエラーが発生せず、何らかの理由でスクリプトがテキスト ファイルの最後で EOF に達しません。getchar は、テキスト ファイルの最後に到達したときに EOF を返すべきではありませんか? テキスト (text.txt) ファイルは作成されますが、編集されているようには見えません。そのため、while ループのどこかで問題が発生しています。

私は C プログラミングに慣れていないので (わかりませんが)、この小さなスクリプトに困惑しています。

任意の助けをいただければ幸いです。または、さらに詳細なサイトへのリンクも素晴らしいでしょう。

乾杯、

S.

4

3 に答える 3

2

あなたが本質的に言うことは次のとおりです。

  • コンソール: my_program を実行、出力をすべて te s t.txt に書き込みます。

  • プログラム: t x t.txt を開き、stdin への入力をそのファイルに書き込みます。


コンソールには通常、 と の 3 つの標準ストリームstdinstdoutありstderrます。これらのストリームはリダイレクトできます。Windows を使用している場合は、redirectionも参照してください。

と言うとき./my_prog > test.txt、コンソールに (ではなくmy_prog) 伝えることは、書き込みをファイルにmy_prog書き込むことです。stdouttest.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;
}

したがって、実行方法は次のとおりです。

あなたのコードで:

  1. text.txt を開く
  2. 入力待ち (標準入力に入力されたデータ) - 通常、ユーザーがコンソールにテキストを入力し、Enterが押されたときにプログラムに渡されます。

コンソールで:

  1. my_progからすべてを test.txt にリダイレクトします。

あなたは言う:

スクリプトが EOF に達しない

それから読み取ると、stdin(例外なく) 2 つの条件下でのみ EOF が取得されます。

  1. ファイルをプログラムにリダイレクトする場合。すなわち./my_prog < foo.txt(通知<、ではありません>)。
          - その場合my_prog、ファイルからデータを読み取り、foo.txtそのファイルが終了すると、プログラムは EOF を受け取ります。そして、それゆえにやめてください。

  2. に 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 ...

これにより、コードがより安全になり、どこで失敗したかなどのヒントが得られます。


いくつかのリンク:

于 2012-04-01T12:55:30.140 に答える
0

getchar は、標準入力 (stdin) から次の文字を返します。stdin を引数とする getc と同等です。

したがって、コードは FILE* 入力ではなく標準入力から読み取ります。

ここで fgetc を使用します。fgetc は、指定されたストリームの内部ファイル位置インジケータによって現在ポイントされている文字を返します。内部ファイル位置インジケータは、次の文字を指すために 1 文字進められます。

したがって、 fgetc を使用してファイルから読み取ります。

while ((ch = fgetc(input)) != EOF)
于 2012-04-01T08:52:49.633 に答える
0

プログラムとシェルの両方が同じファイルを書き込んでいます。> test.txtコマンドラインから出力リダイレクトを削除する必要があります

于 2012-04-01T08:54:32.640 に答える