【发布时间】:2013-05-21 14:35:11
【问题描述】:
由于我发现fflush(stdin) 不是处理熟悉的“输入缓冲区中的换行符”问题的可移植方法,所以当我必须使用以下方法时,我一直在使用以下方法 使用scanf:
while((c = getchar()) != '\n' && c != EOF);
但今天我偶然发现了我从cplusplus.com on fflush 注意到的这条线:
fflush()...在为更新而打开的文件中(即,为读取和写入而打开),流应在输出操作之后刷新,然后再执行输入操作。这可以通过重新定位(fseek、fsetpos、rewind)或显式调用 fflush 来完成
事实上,我之前已经读过很多次了。所以我想确认我是否可以在scanf() 之前简单地使用以下任何一个来实现fflush(stdin) 在支持时所服务的相同目的:
fseek(stdin,1,SEEK_SET);
rewind(stdin);
PS rewind(stdin) 似乎很安全并且可以刷新缓冲区,我错了吗?
错误如果我们谈论的是stdin,我应该提到fseek(stdin,0,SEEK_SET),因为在这种情况下我们不能使用除0或ftell()返回的任何偏移量。
【问题讨论】:
-
根据您的报价,“... 输出操作后应刷新流 ...”。您是否希望在
stdin上执行输出操作,以要求fflush(stdin)?这似乎很愚蠢!你想write到一个read-only流吗?!为什么不描述 刷新缓冲区 的含义,或者您希望fflush(stdin)做什么?您可能还想考虑fflush根据a non-C++ manual 实际做了什么。毕竟这是 C,不是 C++…… -
@undefinedbehaviour 这不是我的引述。这来自cplusplus.com/reference/cstdio/fflush,它涉及两个 I/O 流,而不是特别是
stdin。我的意思是,当从stdin阅读时,根据那段,我们可以使用rewind()或fseek()来刷新它。 -
stdin仅供阅读,不可更新(读写)。不要混淆这两种模式。该网站严重不准确的情况并不少见。查找另一个手动站点。我推荐 opengroup。 -
@undefinedbehaviour 好吧,我从来没有说过我打算写到
stdin。我的意思是,如果之前的 Enter 键还有一个换行符,那为什么可以我们不是在上面使用fseek()和rewind()(为了刷新它)。你的意思是说stdin 不可搜索?是这样吗? -
没有。我的意思是说 stdin 不可写。
fflush导致数据被写入。点击我第一条评论中的链接,你会看到的。有三种访问模式:打开读取、打开写入和打开更新。 刷新它是什么意思?在不使用 flush 一词的情况下定义这个过程(因为那是胡言乱语),你会发现即使文件是可搜索的,seek 也无济于事。
标签: c fseek fflush input-buffer