1.缓冲区概述标准I / O提供三种类型的缓冲区:1.完整缓冲区:实际的I / O操作在填充标准I / O缓冲区之后执行。
常规文件(例如普通文本文件)通常被完全缓冲。
2.行缓冲:在输入和输出中遇到换行符时,标准I / O库将执行I / O操作。
这使我们一次只能输出一个字符,但只能在执行实际I / O操作之前写一行之后。
当标准输入和标准输出与终端设备(例如屏幕)相对应时,它们通常是行缓冲的。
3.不带缓冲:每次用户程序编写一个库函数时,都必须通过系统调用(例如系统调用函数)将其写回到内核。
标准错误输出通常没有缓冲,因此用户程序生成的错误消息可以尽快输出到设备。
2.完整的缓冲区测试代码:int main(int argc,char * argv []){FILE * fp = NULL; //打开以进行读取和写入,如果文件不存在则创建文件fp = fopen(“ test。
txt”,“ w +”); if(NULL == fp){printf(”打开错误 ");返回1;} char * str =“ C ++程序员 " fwrite(str,1,strlen(str),fp); //将内容写入文件while(1); //程序在这里被阻止,返回0;}运行程序,并发现test.txt具有无内容。
由于正常,文件通常被完全缓冲。
仅当缓冲区已满时,内容才会写入文件。
接下来,让我们修改以上示例。
测试代码:#include& lt; stdio.h& gt; #include& lt; string。
h& gt; int main(int argc,char * argv []){FILE * fp = NULL; //打开以进行读写,如果文件不存在则创建文件fp = fopen(“ test.txt”,“ w + ”);如果(NULL == fp){printf(“打开错误 ");返回1;} char * str =" test " int i = 0; while(i& == 512){//缓冲区的大小不确定,i的大小只是调试值fwrite(str,1,strlen(str),fp ); //写文件内容i ++;} while(1); //程序在这里被阻塞,返回0;}上面的示例是将内容循环写到文件中,以便可以填充缓冲区,并且事实证明该文件包含内容。
实际上,如果您想成功地将内容写入文件,除了填充缓冲区外,还有其他方法。
2.1如果您手动关闭文件,即使缓冲区未满,内容也会写入文件#include& lt; stdio.h& gt; #include& lt;中。
string.h& gt; int main(int argc,char * argv []){FILE * fp = NULL; //打开以进行读写,如果文件不存在则创建文件fp = fopen(“ test.txt”,“ w + ”); if(NULL == fp){printf(“打开错误 ");返回1;} char * str ="测试正常 " fwrite(str,1,strlen(str),fp); //将内容写入文件fclose(fp); //人工关闭文件,即使缓冲区未满,内容也会被写入文件while(1); //程序在这里被阻塞,返回0;} 2.2程序正常结束,即使未填充缓冲区且文件未关闭,内容也会写入文件中。
#include& lt; stdio.h& gt; #include& lt; string.h& gt; int main(int argc,char * argv []){FILE * fp = NULL; //打开以进行读写。
如果文件不存在,则创建fp = fopen(“ test.txt”,“ w +”); if(NULL = = fp){printf(“打开错误 ");返回1;} char * str ="测试正常 " fwrite(str,1,strlen(str),fp); //向文件写入内容返回0; //即使缓冲区未填充且文件未关闭,程序也会正常结束}。
3.行缓冲区#include& lt; stdio.h& gt; int main(int argc,char * argv []){printf(“ hello test”); while(1); return 0;}运行此程序,您会发现hello test它没有打印在屏幕上。
因为标准输入和标准输出通常在与终端设备相对应时是行缓冲的,所以当输入和输出中遇到换行符时,标准I / O库将执行I / O操作。
如下:#include< stdio.h> int main(int argc,char * argv []){printf(“ hello test " while(1); return 0;}除了遇到换行符,还有其他执行I / O操作的方法。
3.1缓冲区已满int main(int argc,char * argv []){while(1){//循环打印,缓冲区总是充满了printf(“ hello sunplusedu”);} while(1); return 0;} 3.2人工刷新缓冲区#include< stdio.h& gt; int main(int argc,char * argv []){printf(“ hello test”); fflush(stdout); //人工刷新while(1);返回0;} 3.3程序正常结束#include& lt ; stdio.h& gt; int main(int argc,char * argv []){printf(“ hello sunplusedu”);返回0; //程序正常结束} 4.没有缓冲区#include& lt; unistd.h& #include