有关windows缓冲模式的问题

作者:超级管理员 更新时间:2017-10-31 07:58:58 来源:未知 点击:15642
本帖最后由niexuezhi2384于2017-10-2122:38:33编辑FILE *pf = fopen("E:\\2.txt", "w");setvbuf(pf, NULL, _IONBF, 
本帖最后由 niexuezhi2384 于 2017-10-21 22:38:33 编辑
	
FILE *pf = fopen("E:\\2.txt", "w");
setvbuf(pf, NULL, _IONBF, 0);    //设置无缓冲模式, 即刻生效
fputs("1234567890", pf);


	
FILE *pf = fopen("E:\\1.txt", "w"); 
fputs("1234567890", pf);  


上面第一段代码, 我设置为无缓冲模式, 在编译运行 *.exe 期间 打开E盘下的1.txt 文档, 里面被写入 字符串 1234567890.

但下面那段代码没有,程序编译运行期间 打开1.txt ,里面为空。 
(程序关闭后再打开1.txt 里面是有字符 1234567890 的)

想问下 如果上面设置是 无缓冲模式, 那下面是什么缓冲模式? 无缓冲么?还是全缓冲模式? 为什么?



http://en.cppreference.com/w/c/io/setvbuf

缓冲分为:无缓冲,行缓冲和全缓冲;文件写(若是默认状态)是全缓冲模式(当数据在缓存里达到一定数值则将缓存里的数值刷到文件里),缓存大小是可以配置,一般是是页的整数倍;
标准输入和输出一般是行缓冲;
对于缓存的分类,建议从网上详细查阅一下;

等你调用完colse,才有内容送到文件。
也就是全缓冲模式。

fflush
Flushes a stream.

int fflush( FILE *stream );

Function Required Header Compatibility 
fflush <stdio.h> ANSI, Win 95, Win NT 


For additional compatibility information, see Compatibility in the Introduction.

Libraries

LIBC.LIB Single thread static library, retail version 
LIBCMT.LIB Multithread static library, retail version 
MSVCRT.LIB Import library for MSVCRT.DLL, retail version 


Return Value

fflush returns 0 if the buffer was successfully flushed. The value 0 is also returned in cases in which the specified stream has no buffer or is open for reading only. A return value of EOF indicates an error.

Note   If fflush returns EOF, data may have been lost due to a write failure. When setting up a critical error handler, it is safest to turn buffering off with the setvbuf function or to use low-level I/O routines such as _open, _close, and _write instead of the stream I/O functions.

Parameter

stream

Pointer to FILE structure

Remarks

The fflush function flushes a stream. If the file associated with stream is open for output, fflush writes to that file the contents of the buffer associated with the stream. If the stream is open for input, fflush clears the contents of the buffer. fflush negates the effect of any prior call to ungetc against stream. Also, fflush(NULL) flushes all streams opened for output. The stream remains open after the call. fflush has no effect on an unbuffered stream.

Buffers are normally maintained by the operating system, which determines the optimal time to write the data automatically to disk: when a buffer is full, when a stream is closed, or when a program terminates normally without closing the stream. The commit-to-disk feature of the run-time library lets you ensure that critical data is written directly to disk rather than to the operating-system buffers. Without rewriting an existing program, you can enable this feature by linking the program’s object files with COMMODE.OBJ. In the resulting executable file, calls to _flushall write the contents of all buffers to disk. Only _flushall and fflush are affected by COMMODE.OBJ.

For information about controlling the commit-to-disk feature, see Stream I/O, fopen, and _fdopen.

Example

/* FFLUSH.C */

#include <stdio.h>
#include <conio.h>

void main( void )
{
   int integer;
   char string[81];

   /* Read each word as a string. */
   printf( "Enter a sentence of four words with scanf: " );
   for( integer = 0; integer < 4; integer++ )
   {
      scanf( "%s", string );
      printf( "%s\n", string );
   }

   /* You must flush the input buffer before using gets. */
   fflush( stdin );
   printf( "Enter the same sentence with gets: " );
   gets( string );
   printf( "%s\n", string );
}


Output

Enter a sentence of four words with scanf: This is a test
This
is
a
test
Enter the same sentence with gets: This is a test
This is a test


Stream I/O Routines

See Also   fclose, _flushall, setvbuf

windows系统默认无缓冲模式

推荐阅读

热门内容

C语言问题求助 求知道这种方式的人给解释

说清楚点吧  我这是常用算法程序集(C/...

已知两条直线和鼠标所在点,求经过鼠标所在

计算公式是有的,但是不同与我们手动计算用...

位数组问题 c和指针第5章第4道题

题目要求主函数是自定义的有两个问题:第一...

用Qt graphics view实现许

这个效果不错,关注。...

无GPU下win764+vs2013安装

在编译build_cpu_only中的M...

cppcms-1.0.5 windows

本帖最后由lovton于2017-10-...

vs2015 字体 不能加粗 什么原因呢

设置了  粗体  可是根本没任何效果这是...

下面的程序输出结果为什么是1111101

class one{public:one...

救急!!!江湖救急!!!拜托各位大佬了!

各位大佬帮忙看一下我写的这个程序出了什么...

为什么在c语言头文件中函数的声明是下划线

本帖最后由MHLAH于2017-10-2...

最新内容

坤鹏论:当趣店罗敏试图用道德回应一切质疑时,就已经输了!

  1998年日本高利贷公司“武富士”在东京交易所上市,其创始人武井保雄在199...

坤鹏论:天猫精灵99元血价促 趣店罗敏引领我们学习贷款利率咋算

                登录/注册后可看大图  坤鹏论在晚上写文章前,先...

坤鹏论:凭什么罗振宇李笑来可以成功?因为他们更懂知识!

一、阿里投资乐视风声再起                登录/注册后可看大图  ...

坤鹏论:为现金贷洗地的专家 请你们赶紧闭嘴

                登录/注册后可看大图  现金贷的舆论热潮来得快,...

坤鹏论:iPhoneX首日预购超历史纪录 它可能是历史超热卖的手机

  相信大部分上班的人,周日的晚上是最珍贵的,因为睡醒觉就是繁忙的周一,坤鹏论的...

从控制台向变量输入值出现的问题

大家好,我在练习c语言课后习题时,有一题是输入两个float变量的值,即scan...

C语言问题求助 求知道这种方式的人给解释下

说清楚点吧  我这是常用算法程序集(C/C++描述)这本书的代码 本来我是想要移...

坤鹏论:iPhoneX更像概念机 为的是震慑对手和挽回iPhone 8的尴尬

                登录/注册后可看大图相信今天凌晨很多人都在等待着...

有关windows缓冲模式的问题

本帖最后由niexuezhi2384于2017-10-2122:38:33编辑F...

已知两条直线和鼠标所在点,求经过鼠标所在点并且与两线相切的圆

计算公式是有的,但是不同与我们手动计算用的是常量,C++方式计算太多繁琐,求各位...

用天空和大海上色 X20推出新配色vivo蓝

    伴随着双十一的临近,各大手机品牌都在忙着各种促销。而在这一众忙碌中,vi...

中兴发布Blade A3人脸识别手机 799元起

    2017年10月30日,中兴通讯在北京举行Blade A3媒体品鉴会,给...

曝360李开新录综艺节目 全面屏或将发布

    10月30日,在社交媒体中曝出一张疑似360手机总裁李开新正在录制“有话...

科技6点半:iPhoneX预购开启销量达550万

    科技6点半,带您快速浏览今天手机行业发生的大事,每天18点30分准时送出...

8848推超跑定制版 开豪车手机有的选了

    10月29日,“2017 China GT 颁奖盛典暨汽车运动在中国11...

jquery 配合el表达式的问题

我想在想要做的是把var  id    的值放到 list    集合里面,变成...

关于restful api访问路径的写法

我想要将路径写成:/imm/assignments/list?page={pag...

java 每次调用对象方法都要初始化成员变量?

代码如下:package test;public class Test1 {in...

【debug】java

package math011;public class Math011 {pr...

如何禁止前台代码直接访问服务器上文件夹

环境:tomcat,servletWEB-INF文件夹下内容是无法在网页中通过u...