Jug*_*gni 6 c fseek fflush input-buffer
由于我发现fflush(stdin)不是一种可移植的方式来处理熟悉的"新行潜伏在输入缓冲区中"的问题,所以当我必须使用时,我一直在使用以下内容scanf:
while((c = getchar()) != '\n' && c != EOF);
Run Code Online (Sandbox Code Playgroud)
但今天我偶然发现了我在cflplus.com上关于fflush注意到的这一行:
fflush()...在打开以进行更新的文件中(即,打开以进行读取和写入),在执行输入操作之前,应在输出操作之后刷新流.这可以通过重新定位(fseek,fsetpos,rewind)或通过显式调用fflush来完成
事实上,我已经多次阅读过了.所以我想确认一下,我是否可以简单地使用以下任何一种方法,scanf()以便在fflush(stdin)支持时提供同样的服务:
fseek(stdin,1,SEEK_SET);
rewind(stdin);
Run Code Online (Sandbox Code Playgroud)
PS rewind(stdin)似乎非常安全,可以刷新缓冲区,我错了吗?
错误我应该提到,fseek(stdin,0,SEEK_SET)如果我们正在讨论,stdin因为我们不能使用0或0之外的任何偏移量ftell().
这是唯一可以使用的可移植惯用语:
while((c = getchar()) != '\n' && c != EOF);
Run Code Online (Sandbox Code Playgroud)
包括这个在内的几个线程解释了为什么feesk通常不起作用。出于同样的原因,我怀疑rewind是否会起作用,事实上,手册页说它相当于:
(void) fseek(stream, 0L, SEEK_SET)
Run Code Online (Sandbox Code Playgroud)