读书人

关于清除缓冲区函数fflush()用法? 来

发布时间: 2012-04-06 12:22:24 作者: rapoo

关于清除缓冲区函数fflush()用法? 来人哦。
刚才在查fflush的用法,看见别人说,具体用法看下面程序
程序1:
#include<stdio.h>
main(void)
{
int i;
for(i=0;i<100;i++)
{
printf("%d",i);
fflush(stdout);
}
}

程序2:
#include<stdio.h>
main(void)
{
int i;
for(i=0;i<100;i++)
{
printf("%d",i);
}
}


我这把2个程序拿去运行了,结果一样阿,都是把0到99一个个显示出来了,没看懂到底2个程序区别在哪?或者说fflush作用。。
分不够了,一天要发好几个帖子,所以少给点了,大家讨论讨论。

[解决办法]
你搞错了,fflush是针对缓冲区的,看看下面的例子

C/C++ code
#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){    char i,j;     scanf("%c",&i); //    fflush(stdin);   这里如果没有fflush(stdin)就得不到正确结果,回车或是空格留在缓冲区里,就会自动赋值给j    scanf("%c",&j);    printf("%d  %d\n",i,j);        return 0;}
[解决办法]
使用fflush(stdin)本身就是错误的行为。
[解决办法]
你可以这样比较一下:
C/C++ code
// 程序1int main(){    for (int i = 0; i < 100; i++)    {        printf("%d\n", i);        sleep(1); // 睡眠1秒    }}// 程序2int main(){    for (int i = 0; i < 100; i++)    {        printf("%d\n", i);        fflush(stdout);        sleep(1); // 睡眠1秒    }}
[解决办法]
我上面写的程序,sleep()函数是Linux下面的系统调用,如果在windows下面,要包含头文件windows.h,用函数Sleep(1000);代替
[解决办法]
好吧,在百度中找到了
也许有人会说:“居然这样,那么在 scanf 函数后面加上‘fflush(stdin);’,把输入缓冲清空掉不就行了?”然而这是错的!C和C++的标准里从来没有定义过 fflush(stdin)。也许有人会说:“可是我用 fflush(stdin) 解决了这个问题,你怎么能说是错的呢?”的确,某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(linux 下的 gcc 就不支持),因为标准中根本没有定义 fflush(stdin)。MSDN 文档里也清楚地写着fflush on input stream is an extension to the C standard(fflush 操作输入流是对 C 标准的扩充)。
[解决办法]
我这把2个程序拿去运行了,结果一样阿,都是把0到99一个个显示出来了,没看懂到底2个程序区别在哪?或者说fflush作用。。
分不够了,一天要发好几个帖子,所以少给点了,大家讨论讨论。
-------------------------
fflush一般来说是用于文件输出流的,虽然用于stdout也可以,但通常stdout输出的东西都是马上在显示器上出现的,因此你会看不到具体的效果。

读书人网 >C语言

热点推荐