可以使用fseek(stdin,1,SEEK_SET)或倒带(stdin)来刷新输入缓冲区而不是非便携式fflush(stdin)吗?

时间:2013-05-21 14:35:11

标签: c fseek fflush input-buffer

由于我发现fflush(stdin)不是一种可移植的方式来处理熟悉的"换行符在输入缓冲区" 中的问题,我一直在使用以下内容当我必须使用scanf时:

while((c = getchar()) != '\n' && c != EOF);

但今天我偶然发现了我从cplusplus.com on fflush注意到的这一行:

  

fflush()...在打开更新的文件中(即,打开以进行读取和写入),在执行输入操作之前,应在输出操作之后刷新流。这可以通过重新定位(fseek,fsetpos,倒带)或通过显式调用fflush来完成

事实上,我已经多次阅读过了。所以我想确认一下scanf()之前我是否可以简单地使用以下任何一项来实现与fflush(stdin)服务时相同的目的支持:

fseek(stdin,1,SEEK_SET);
rewind(stdin);

PS rewind(stdin)似乎非常安全且可以刷新缓冲区,我错了吗?

错误如果我们谈论的是fseek(stdin,0,SEEK_SET)我应该提及stdin,因为我们无法使用0以外的任何偏移或{{1}返回的偏移量在那种情况下。

1 个答案:

答案 0 :(得分:3)

这是唯一可以使用的便携式习语:

while((c = getchar()) != '\n' && c != EOF);

包括this在内的多个主题解释了为什么feesk通常无效。出于同样的原因,我怀疑rewind也会起作用,实际上man page说它等同于:

(void) fseek(stream, 0L, SEEK_SET)