0

可能重复:
将 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 没有读到行尾的常见抱怨,那么最好编写代码来实际读取并丢弃行的其余部分(循环getc直到读取 a '\n',例如,如 pmg 的回答) . 当用于重定向文件或管道而不是正常的控制台/tty 输入时,清除输入缓冲区将倾向于跳过大量数据。

于 2012-10-01T12:29:06.477 回答
1

测试from的返回值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 不适用于标准输入。因为标准输入的大小是未知的。

于 2012-10-01T12:17:42.953 回答