fseek在linux中不起作用

时间:2012-10-01 12:10:38

标签: c linux io inputstream fseek

  

可能重复:
  Using fseek with a file pointer that points to stdin

我有一个程序使用 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;
}

提前致谢!

3 个答案:

答案 0 :(得分:2)

这不是在Windows或Linux上“清除输入缓冲区”的可接受方式。

在Windows上,使用标准C函数的MSVCRT版本,有一个扩展允许fflush(stdin)用于此目的。请注意,在其他系统上,这是未定义的行为。

Linux有一个名为fpurge的功能,具有相同的目的。

但是,我不得不问,为什么你想要清除你的输入缓冲区?如果人们常常抱怨scanf没有读到行尾,那么最好编写代码来实际读取并丢弃行的其余部分(使用getc循环直到读取'\n'例如,在pmg的答案中)。清除输入缓冲区在重定向文件或管道上使用时往往会跳过大量数据,而不是普通的控制台/ tty输入。

答案 1 :(得分:1)

我猜fseek无法使用stdin。因为stdin的大小尚不清楚。

答案 2 :(得分: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(或文件结束或输入错误)。