我有一个程序使用 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;
}
提前致谢!
答案 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(或文件结束或输入错误)。