1

最初から、これら2つの関数を呼び出すとバッファをフラッシュすることが明確に書かれているので、なぜ入力バッファfseek(stdin,0,SEEK_SET)をフラッシュできないのか考えていました(入力または出力に関係なく).しかし、全体のアイデアが新しいように見えたので、私はそれを入れました昨日の不器用な質問。rewind(stdin)cplusplusreference

fseek(stdin,1,SEEK_SET) または rewind(stdin) を使用して、移植性のない fflush(stdin) の代わりに入力バッファーをフラッシュできますか?

率直に言って、そうしない理由がわかりませんでした.今日私はそれを自分で試してみまし. newline lurking in stdinつまり、複数のステートメントを使用しながら問題を処理するには、非ポータブルおよびUBを使用または代わりにscanf()使用できるようです。fseek(stdin,0,SEEK_SET)rewind(stdin) fflush(stdin)

これがリスクのない正しいアプローチであるかどうか教えてください.今まで、私は次のコードを使用して対処していましたnewline in stdin: while((c = getchar()) != '\n' && c != EOF);. 以下は私のコードです:

#include <stdio.h>

int main ()
{
    int a,b;
    char c;
    printf("Enter 2 integers\n");
    scanf("%d%d",&a,&b);
    printf("Enter a character\n");

    //rewind(stdin);   //Works if activated
    fseek(stdin,0,SEEK_SET);  //Works fine

    scanf("%c",&c);  //This scanf() is skipped without fseek() or rewind()
    printf("%d,%d,%c",a,b,c);

}

fseek(stdin,0,SEEK_SET)私のプログラムでは、またはのどちらも使用しない場合rewind(stdin)、2 番目はスキップされ、常にscanf()改行が文字として取り込まれます。またはを使用すると、問題は解決します。fseek(stdin,0,SEEK_SET)rewind(stdin)

4

2 に答える 2

1

行末へのフラッシュが義務付けられた動作であることをどこで読んだのか(それが何であれ)わかりません。cplusplusreference

私が見つけた最も近い一致、http://www.cplusplus.com/reference/cstdio/fseek/およびhttp://www.cplusplus.com/reference/cstdio/rewindは、フラッシュ以外はまったく言及していませんを参考にfflush()

いずれにせよ、C 標準には、この動作を強制するものは何もありません。C11 7.20.9.2 fseekおよび7.20.9.5 rewind(これは、結局のところ、fseekオフセットがゼロの場合と同じであり、SEEK_SET) もフラッシュについて言及していません。

彼らが述べているのは、ファイルポインタがストリーム内の関連する位置に移動されているということだけです。

したがって、これがあなたの環境で機能する限り、私たちが言えることは、これがあなたの環境で機能するということだけです. 他の場所では機能しない可能性があり、将来の不確定な時点であなたの環境で機能しなくなる可能性さえあります.


本当に堅牢な入力が必要な場合は、2 段階のアプローチfgetsを使用して、行を取得し、次にsscanfその行から必要なものを取得する必要があります。入力の 2 つのパラダイム (scanfgetchar) を混在させると、しばしば問題が発生します。

優れた (堅牢で、エラー チェックがあり、必要に応じて行末までクリアする) 入力関数は、こちらにあります

于 2013-05-22T06:17:03.050 に答える
-2

直前にテストして、標準入力で fseek が機能しないことを確認しました。fseek() は通常、ディスク上のファイルに対して機能するため、セキュリティ上の理由から、カーネルによって stdin へのアクセスが禁止されているようです。とにかく、私のように考えている人を見るのはとてもうれしかったです。Tnx 良い質問です。

于 2013-12-14T08:26:15.733 に答える