0

重複の可能性:
stdin を指すファイル ポインターで fseek を使用する

fseekを使用して入力バッファをクリアするプログラムがあります。Windows では問題なく動作しますが、Linux では buf が失敗します。私を助けてください 。

#include <stdio.h>
#define NO_USE_FSEEK    0

int main(int argc, char *argv[])
{
   char ch = 'a';
   int i = 1;
   long int fpos = -1;

   while(1)
   {
      printf("loop : %d\n", i);

      fseek(stdin, 0L, SEEK_END); /*works in Windows with MinGW, fails in Linux*/
      fpos = ftell(stdin);
      if (-1 == fpos)
      {
         perror("ftell failure:");   /*perror tells it is Illegal Seek*/
         printf("\n");
      }
      else
      {
         printf("positon indicator:%ld\n", fpos);
      }
      scanf("%c", &ch);
      printf("%d : %c\n", (int)ch, ch);
      i++;

   }

   return 0;
}

前もって感謝します!

4

3 に答える 3

2

これは、Windows または Linux で「入力バッファーをクリアする」方法として受け入れられていません。

Windows では、標準 C 関数の MSVCRT バージョンを使用して、fflush(stdin)この目的を可能にする拡張機能があります。他のシステムでは、これは未定義の動作であることに注意してください。

Linux にはfpurge、同じ目的で呼び出される関数があります。

しかし、なぜ入力バッファをクリアしたいのですか? scanf が行末まで読み取らないという一般的な不満がある場合は、実際に読み取り、残りの行を破棄するコードを作成することをお勧めします (たとえば、pmg の回答のように、getca を読み取るまでループします)。 '\n'. 入力バッファをクリアすると、通常のコンソール/tty 入力ではなく、リダイレクトされたファイルまたはパイプで使用すると、大量のデータがスキップされる傾向があります。

于 2012-10-01T12:29:06.477 に答える
1

からの戻り値をテストしますfseek()(実際には、すべての<stdio.h>入力関数からの戻り値をテストします)。

if (fseek(stdin, 0, SEEK_END) < 0) { perror("fseek"); exit(EXIT_FAILURE); }

イディオムを使う

while ((ch = getchar()) != '\n' && ch != EOF) /* void */;
/* if (ch == EOF)
**     call feof(stdin) or ferror(stdin) if needed; */

次の ENTER (またはファイルの終わりまたは入力エラー) までの入力バッファー内のすべての文字を無視します。

于 2012-10-01T12:20:23.797 に答える
1

fseek は stdin では動作しないと思います。stdin のサイズがわからないためです。

于 2012-10-01T12:17:42.953 に答える