2026/4/18 9:34:38
网站建设
项目流程
p2p网站开发的流程图,wordpress 微信 商城,做食品网站有哪些,网站模板免费吗文章目录流#xff08;FILE#xff09;文本流与二进制流流的缓冲类型无缓冲行缓冲全缓冲修改缓冲类型标准I/O 由ANSI C标准定义#xff0c;主流操作系统上都实现了C库标准I/O通过缓冲机制减少系统调用#xff0c;实现更高的效率 标准IO是C函数库的常见IO操作接口#xff0…文章目录流FILE文本流与二进制流流的缓冲类型无缓冲行缓冲全缓冲修改缓冲类型标准I/O 由ANSI C标准定义主流操作系统上都实现了C库标准I/O通过缓冲机制减少系统调用实现更高的效率标准IO是C函数库的常见IO操作接口对操作系统提供的系统调用进行封装进一步降低与硬件的耦合提供了缓冲机制减少触发系统调用次数实现了更高的效率- fopen 函数是由封装 open 函数实现 - fclose 函数是由封装 close 函数实现 - fread 函数是由封装 read 函数实现 - fwrite 函数是由封装 write 函数实现 - fseek 函数是由封装 lseek 函数实现标准IO用一个结构体类型来存放打开的文件的相关信息所有操作都是围绕FILE来进行查看FILE结构的定义vi /usr/include/stdio.hvi /usr/include/bits/types/struct_FILE.h文件IO和标准IO对比流FILE标准IO用一个结构体类型来存放打开的文件的相关信息标准I/O的所有操作都是围绕FILE来进行FILE又被称为流(stream)文本流/二进制流文本流与二进制流文本流数值以字符形式每一个字符都是一个字节对应ASCII码值。文本流中的数据可以显示和打印出来都是用户可以读懂的信息二进制流流中的数据是按照二进制编码的方式值的方式来存放文件。二进制数据也可在屏幕上显示但其内容无法读懂二进制流比文本流更节省空间且不用对换行符进行转换这样可以大大加快流的速度提高效率二进制流没有行长度的限制也可以包含空字符NULL。因此对于含有大量数据信息的数字流可以采用二进制流的方式对于含有大量字符信息的流则采用文本流的方式流的缓冲类型标准I/O预定义3个流程序运行时自动打开名称文件描述符(值)常量流缓冲类型标准输入流0STDIN_FILENOstdin通常是行缓冲标准输出流1STDOUT_FILENOstdout当连接到终端时通常是行缓冲标准错误流2STDERR_FILENOstderr默认是无缓冲立即输出无缓冲数据直接写入文件流不进行缓冲#includestdio.h#includeunistd.hintmain(intargc,constchar*argv[]){perror(aaaa);#if0while(1){sleep(1);}#endifreturn0;}程序正常结束会主动刷新缓冲区行缓冲当在输入和输出中遇到换行符(‘\n’)时会自动触发刷新当缓冲区达到其容量限制时会自动触发刷新当 main() 函数返回或调用 exit() 时所有缓冲区的数据都会被刷新当流和一个终端关联时典型的行缓冲printf(Enter name: ); // 可能不会立即显示scanf(%s, name); // 读取前会刷新 stdout#includestdio.h#includeunistd.hintmain(intargc,char*argv[]){inti0;#if0do{printf(a);i;}while(i100);#else//1024do{printf(a);i;}while(i1025);#endifsleep(10);return0;}\n是换行字符printf支持的是行缓冲加上\n刷新了行缓冲实现输出不同的环境是不一样的大小这里标准输出的行缓冲是1024个字节。全缓冲当流的缓冲区无数据或无空间触发刷新当 main() 函数返回或调用 exit() 时所有缓冲区的数据都会被刷新关闭文件或程序正常结束触发刷新全缓冲大小和系统有关系在Ubuntu 14.04 32位系统、Ubuntu 22.04 64位系统测试是4096字节#includestdio.h#includeunistd.hintmain(intargc,char*argv[]){FILE*fdfopen(a.txt,a);fprintf(fd,a);//读、写缓冲区大小printf(%d ,fd-_IO_buf_end-fd-_IO_buf_base);// 4096inti0;do{fprintf(fd,a);i;}while(i4098);//测试写指针偏移量printf(%d,fd-_IO_write_ptr-fd-_IO_write_base);// 3sleep(5);return0;}修改缓冲类型通过setbuf、setvbuf函数修改缓冲类型setbuf(stdout, NULL)关闭缓冲将缓冲策略修改为无缓冲#includestdio.h#includeunistd.hintmain(intargc,char*argv[]){printf(a);sleep(5);//a是行缓冲原则是不输出的这时关闭缓冲setbuf(stdout,NULL);//模式是无缓冲后先把缓冲中的a刷了出来b再立马输出printf(b);sleep(5);return0;}