为缓和 CPU 与 I/O 设备之间速度不匹配,文件缓冲区用以暂时存放读写期间的文件数据而在内存区预留的一定空间。使用文件缓冲区可减少读取硬盘的次数。
系统自动地在内存为程序中每一个正在使用的文件开辟一块文件缓冲区。
int fflush( FILE *stream );
将缓冲区内数据写到stream 指定文件。
成功返回 0
错误返回 EOF
高版本vs无法使用
fclose关闭文件时也会刷新缓冲区
#include
#include
int main()
{
FILE* pf = fopen("test7.txt", "w");
if (!pf)
{
perror(fopen);
return 1;
}
fputs("abcdef", pf); //数据输出到buffer
//此时文件中无内容
Sleep(10000); //睡眠10s
fflush(pf); //刷新缓冲区
Sleep(10000); //睡眠10s
//此时数据到达文件
fclose(pf);
pf = NULL;
return 0;
}
在linux下gcc编译这两段代码时 结果是不同的 左边先输出后睡眠 右边先睡眠后输出
c语言不是从上到下一行一行执行的吗?
确实是的 实际上printf先于sleep执行但是sleep执行完后这个程序才结束 才会输出信息
为什么执行流到printf时 不直接显示以及为什么左边加了换行就能先显示?
c语言存在输出缓冲区(一段内存空间) 显示器设备一般的刷新策略是行刷新 即碰到\n就把\n之前的所有的字符显示出来 所以左边代码先显示 后边代码存入到缓冲区 直到程序结束才显示
当一个程序执行会自动打开stdin srdout stderr三个标准IO流
如何在没有换行符的情况下让他执行到printf时就显示?
#include
#include
int main()
{
printf("hello linux!");
fflush(stdout);
sleep(3);
return 0
}
2.1 回车\r和换行\n
老式键盘的
Enter
: 实际上是 换行+回车[C语言中的\n也是]
#include
#include
int main()
{
int count = 5;
while(count)
{
printf("count是: %d\n",count);
count--;
sleep(1);
return 0;
}
}
可以正常输出
#include
#include
int main()
{
int count = 5;
while(count)
{
printf("count是: %d\r",count);
count--;
sleep(1);
return 0;
}
}
不输出任何内容
#include
#include
int main()
{
int count = 5;
while(count)
{
printf("count是: %d\r",count);
fflush(stdout);
count--;
sleep(1);
return 0;
}
}
每执行一次printf 将要输出的信息输出到缓冲区 当执行fflush函数时 将信息从缓冲区刷到显示器 之后\r回车 光标回到行首 count–
linu-vim-c-bar