fflush函数小结及使用误区

【C语言学习笔记】MATH中的常用函数大汇总及应用 MATH中的常用函数大汇总: *开头需引入#include <math.h> 1.绝对值 整数:int x = abs(y); 浮点数:double x = fabs(y); 2.指数和对数 求e的y次幂:double x = exp(y); 求x为底数的y次幂:double n = pow(x,y); 计算x的开平方:double x = sqrt(x); 求logeX:double n = log(x); 求log10X:double n = log10(x); 题目一: 计算两点间的距 阅读详情
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript> </script> fflush函数小结及使用误区:

参考: http://www.ninstein.com/blog/article.asp?id=12

1、C99 对 fflush 函数的定义:

int fflush(FILE *stream);

如果stream指向输出流或者更新流(update stream),并且这个更新流最近执行的操作不是输入,那么fflush函数将把任何未被写入的数据写入stream指向的文件(如标准输出文件stdout)。否则,fflush函数的行为是不确定的。
fflush(NULL)清空所有输出流和上面提到的更新流。如果发生写错误,fflush函数会给那些流打上错误标记,并且返回EOF,否则返回0。

由此可知,如果 stream 指向输入流(如 stdin),那么 fflush 函数的行为是不确定的。故而使用 fflush(stdin) 是不正确的,至少是移植性不好的。

<stdio.h>,成功返回0,出错返回EOF。

2、使用注意点及误区

为什么 fflush(stdin) 是错的?
首先请看以下程序:
Quote:

程序代码 程序代码
#i nclude<stdio.h>
int main( void )
{
    int i;
    for (;;) {
        fputs("Please input an integer: ", stdout);
        scanf("%d", &i);
        printf("%d/n", i);
    }
    return 0;
}

这个程序首先会提示用户输入一个整数,然后等待用户输入,如果用户输入的是整数,程序会输出刚才输入的整数,并且再次提示用户输入一个整数,然后等待用户输入。但是一旦用户输入的不是整数(如小数或者字母),假设 scanf 函数最后一次得到的整数是 2 ,那么程序会不停地输出“Please input an integer: 2”。这是因为  scanf("%d", &i); 只能接受整数,如果用户输入了字母,则这个字母会遗留在“输入缓冲区”中。因为缓冲中有数据,故而 scanf 函数不会等待用户输入,直接就去缓冲中读取,可是缓冲中的却是字母,这个字母再次被遗留在缓冲中,如此反复,从而导致不停地输出“Please input an integer: 2”。

也许有人会说:“居然这样,那么在 scanf 函数后面加上‘fflush(stdin);’,把输入缓冲清空掉不就行了?”然而这是错的!C和C++的标准里从来没有定义过 fflush(stdin)。也许有人会说:“可是我用 fflush(stdin) 解决了这个问题,你怎么能说是错的呢?”的确,某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(gcc3.2不支持),因为标准中根本没有定义 fflush(stdin)。MSDN 文档里也清楚地写着 fflush on input stream is an extension to the C standard (fflush 操作输入流是对C标准的扩充)。当然,如果你毫不在乎程序的移植性,用  fflush(stdin) 也没什么大问题。

2.      清空输入缓冲区的方法

虽然不可以用 fflush(stdin),但是我们可以自己写代码来清空输入缓冲区。只需要在 scanf 函数后面加上几句简单的代码就可以了。
Quote:
程序代码 程序代码
/* C 版本 */
#i nclude<stdio.h>

int main( void )
{
    int i, c;
    for (;;) {
        fputs("Please input an integer: ", stdout);
        if ( scanf("%d", &i) != EOF ) { /* 如果用户输入的不是 EOF */
            /* while循环会把输入缓冲中的残留字符清空 */
            /* 读者可以根据需要把它改成宏或者内联函数 */
            /* 注:C99中也定义了内联函数,gcc3.2支持 */
            while ( (c=getchar()) != '/n' && c != EOF ) {
                  ;
            } /* end of while */
        }
        printf("%d/n", i);
    }
    return 0;
}


运行结果:
当输入数字时,正常;
当输入字母时,i的值不改变,printf输出的仍是上一次的值。由于输入缓冲区每次都被清空,所以也就不存在scanf自动不停读取缓冲区的值的情况。

/* C++ 版本 */
Quote:

#i nclude <iostream>
#i nclude <limits>  // 为了使用numeric_limits

using std::cout;
using std::endl;
using std::cin;

int main( )
{
      int value;
      for (;;) {
              cout << "Enter an integer: ";
              cin >> value;
/* 读到非法字符后,输入流将处于出错状态,
              * 为了继续获取输入,首先要调用clear函数
              * 来清除输入流的错误标记,然后才能调用
              * ignore函数来清除输入缓冲区中的数据。 */         
              cin.clear( );
              /* numeric_limits<streamsize>::max( ) 返回缓冲区的大小。
              * ignore 函数在此将把输入缓冲区中的数据清空。
* 这两个函数的具体用法请读者自行查询。 */
              cin.ignore( std::numeric_limits<std::streamsize>::max( ), '/n' );
              cout << value << '/n';
      }
      return 0;
}

该版本有待进一步研究。之前在C++ Primer上讲述过其细节。

参考资料:ISO/IEC 9899:1999 (E) Programming languages — C
7.19.5.2 The fflush function

                    The C Programming Language 2nd Edition By Kernighan & Ritchie

  ISO/IEC 14882(1998-9-01)Programming languages — C++ 
 
fflush的实现源码解读 当我们使用file的时候。 阅读详情

相关推荐

人形机器人人机交互解决方案(2026完整版)

《人形机器人人机交互解决方案(2026完整版)》摘要 本项目针对2026年人形机器人产业爆发式增长需求,提出了一套完整的人机交互解决方案。方案包含十大核心模块(语音识别、情感识别、手势识别等),采用五层架构设计,实现多模态融合交互,响应时间≤32ms,准确率≥99%。覆盖制造业巡检、家庭服务等10大场景,适配20+主流机型。项目总投资4.1亿元,预期年营收8.2亿元,将申请专利120项,培养专业人才300人。通过技术创新解决当前交互体验生硬、安全可控性不足等痛点,助力我国人形机器人产业实现从"跟跑

随读手记 742

关于fflush(stdin)与getchar()清除缓冲区的优劣。

在清除缓存区时的三种方式

Heart_Breezer的博客 782

C++fflush()函数与rewind()函数

fflush()函数与rewind()函数都可以使得scanf()函数屏蔽之前输入的回车符。这两个函数的参数都可以是stdin变量。1 stdinstdin一起使用的还有stdout和stderr,这三个变量都是FILE结构的指针,在stdio.h头文件中定义。stdin是标准的输入流;stdout是标准的输入流;stderr是标准的错误流。默认情况下,stdin从键盘中读取数据,而stdout...

hou09tian的博客 3957

C/C++ —— fflush(stdin)(

C/C++ —— fflush(stdin)<br />                                      1.       为什么 fflush(stdin) 是错的首先请看以下程序:#include<stdio.h><br />int main( void ){    int i;    for (;;) {        fputs("Please input an integer: ", stdout);        scanf("%d", &i);        prin

dqswuyundong的专栏 1310

清空输入缓冲 与 fflush

1.       为什么 fflush(stdin) 是错的首先请看以下程序:                   #include stdio.h> int main( void ){    int i;    for (;;) {        fputs("Please input an integer: ", stdout);        scanf(

jia_xiaoxin的专栏 1058

C/C++fflush(stdout)循环打印输出避免缓存区错误

使用多个输出函数连续进行多次输出时,有可能发现输出错误。因为下一个数据再上一个数据还没输出完毕,还在输出缓冲区中时,下一个printf就把另一个数据加入输出缓冲区,结果冲掉了原来的数据,出现输出错误。 在 printf();后加上fflush(stdout); 强制马上输出,避免错误。 实例 //线程函数(1秒输出现记录的信息) static void *stats_thread(void...

墨痕诉清风的博客 1279

jQuery MiniUI 开发教程 导航控件 ToolBar:工具栏(一)

[b]ToolBar:工具栏[/b] [img]http://www.miniui.com/docs/api/images/toolbar.gif[/img] 参考示例:[url=http://www.miniui.com/demo/toolbar/toolbar.html]ToolBar:工具栏[/url] [b]创建工具栏[/b] 增加 修改 删...

iteye_4698的博客 1133

fflush()函数总结

1. 概述 函数名: fflush() 功 能: 清除读写缓冲区,需要立即把输出缓冲区的数据进行物理写入时 头文件: stdio.h 原型: int fflush(FILE *stream),其中stream是要冲洗的流 2. 函数说明 fflush()会强迫将缓冲区内的数据写回参数stream 指定的文件中. 如果参数stream 为NULL,fflush()会将所有打开的文...

dijingzhou4259的博客 2742

C/C++ 误区二:fflush(stdin)

<!--google_ad_client = "pub-2132256014190581";/* 160x600, 创建于 09-1-4 */google_ad_slot = "4461398019";google_ad_width = 160;google_ad_height = 600;//-->1.       为什么 fflush

嵌入式 Linux ARM ADS ADHOC C C++ PLC 单片机 2592

常见的C++知识

scanf函数 定义在<stdio.h>中,是格式转换函数,即按用户指定的格式从键盘上把数据输入到指定的变量中。 成功输入则返回“1”。 头文件必须使用保护宏 C++中防止头文件被包含两次有两种方法解决: 【A:保护宏】 #ifndef _ABCDE_H #define _ABCDE_H //代码部分 #endif 在被包含过一次之后,宏_ABCDE_H已经有了,下次再碰到就会略过从#define _ABCDE_H开始到#endif之间的代码 【B:还有一种特定编译器支持的指令:】 b.#pragma

LinJM-机器视觉 3115

春季开学 第二篇

fflush(stdin); 这个在写课设的时候会遇到,fflush() 啥意思? 这个是清空输入缓存区 的意思, 这个看似基础的内容,其实初学C语言的时候很容易被忽略,但是其实很重要,现在重新理解一遍 先来一段最最简单的经典代码 #include <stdio.h> int main(){ int a; scanf("%d",&a); printf("%d",a); return 0; } 这个程序很简单,你输入一个整数,就输出一个整数。 这个过程。

qq_35917517的博客 119

fflush(stdin)功能以及实际应用的个人体会,对初学者应该挺有用

fflush(stdin)的功能是清空输入缓冲区,至于什么是输入缓冲区,在下面会有解释。 举个例子,“现在要求往一个整型数组里输入3个整数,并且输出指定序号对应的元素”。比如输入11,12,13,之后输出第2个元素,应该输出12。代码如下: #include "iostream" using namespace std; int main() { int elem[20

桔子 2109

C语言 清空缓冲区输入/输出方法

1. 清空输出stdout缓冲区 在 C 和 C++ 中,你可以使用 fflush 函数来清空输出缓冲区。以下是一个示例 #include <stdio.h> int main() { printf("这是一行文本\n"); fflush(stdout); // 清空标准输出缓冲区 // 后续的输出将会立即显示在屏幕上 printf("这一行将会立...

eehongzhijun的博客 3207

fflush

@求fflush(stdin)fflush(stdout)用法 #includevoid main(){int a,b,c,d;fflush(stdin);scanf("%d%d%d",&a,&b,&c);if(a > b)  d = a;else  d = b;if(c > d)  d = c;printf("%d/n",d);fflush(stdout);}这样的一个问题。假如输入的不是

guxue365的专栏 5854

IO之如何刷新缓冲区(c++、c、linux)

使用printf或者cout等将数据输出到显示器上时,数据会先进入对应的输出缓冲区,只有当缓冲区被刷新时,数据才会真正来到显示器。

2301_81570594的博客 435

c语言fflush,c语言中fflushstdin)作用(转)

1. 为什么 fflush(stdin) 是错的首先请看以下程序:#include int main( void ){int i;for (;;) {fputs("Please input an integer: ", stdout);scanf("%d", &i);printf("%d/n", i);}return 0;}这个程序首先会提示用户输入一个整数,然后等待用户输入,...

weixin_29823011的博客 441

【C/C++】库缓冲区

GLibc(GNU C Library)为文件 I/O 提供了三种常见的缓冲模式:无缓冲、行缓冲和全缓冲,每种模式的工作原理和使用场景有所不同。文件是全缓冲,所以在fork之后,子进程会继承父进程的数据,当程序结束,库刷新缓冲区,父进程刷新,子进程就会发生写时拷贝,之后子进程又刷新,所以就是2份,而系统调用write是直接写入文件,所以只有一份。文件默认是全缓冲,库函数先写入到库缓冲区,在程序结束后,GLibc才会刷新到文件,但是此时write已经执行,所以write打印在前面。仍然可以达到库的效果。

2201_75443644的博客 3248

基础IO详解

基础IO详解

weixin_58867976的博客 1580

二十一.基于国民MCU 的增加M4F DSP库调用的验证

Cortex-M4F内核不仅内置硬件FPU单元,还支持多种DSP指令集,比如支持单周期乘加指令(MAC)等。因此Cortex-M4执行所有的DSP指令集都可以在单周期内完成,而Cortex-M3和M0需要多个指令和多个周期才能完成同样的功能。比如开方运算,M3和M0只能通过迭代法(标准数学函数库)计算,而M4F直接调用VSQRT指令完成。参考:\Nationstech.N32G45x_Library.1.1.1\Nationstech.N32G45x_Library.1.1.1\projects\n32g4

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 907

PC版本 网易云音乐.uc格式的缓存文件转.mp3

讲网易云音乐cache文件夹里面的 .uc 文件自动编码MP3,识别 歌手,歌名文件夹支持批量和单独文件编码,自动输出,亲测可用无病毒!

上一篇: C语言中可变参数的用法
下一篇: C/C++ 误区二:fflush(stdin)
zht_sir
博客等级 码龄20年 103粉丝 8原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值