[Linux系统编程] IO标准缓冲区

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

联系方式

自1984年起,久尹开始研发并制造质量可靠的电子元件及相关设备 并以创新的设计技术在机械设备上增加良好的使用者界面,因此成为全球被动零件领域的知名设备制造商。 久尹一直凭借着诚实、负责与积极的心态去克服各项挑战,让团队得以建立核心能力与价值。久尹的团队拥有机械设计技术、实际的全球性代工经验、优质的概念以及与国际市场的交流及互动能力。这些竞争优势为久尹及其所有的合作伙伴提供了亮丽的未来,并能够在多变的环境与市场下继续保持领先地位。

查看详情

在线咨询