系统编程之文件IO(八)——缓冲区的设置

简介: 系统编程之文件IO(八)——缓冲区的设置

一、缓冲类型


1.1 全缓冲


缓冲方式要求填满整个缓冲区后才进行1/O系统调用操作


第一次执行I/O操作时,ANSI标准的文件管理函数通过调用malloc函数获得需要使用的缓冲区,默认大小为8192

位置:/usr/include/stdio.h——#define _G_BUFSIZ 8192


1.2 行缓冲


当在输入和输出中遇到换行符时,标准I/O库函数将会执行系统调用操作

当所操作的流涉及一一个终端时(例如标准输入和标准输出),使用行缓冲方式

默认行缓冲区的大小为1024


1.3 无缓冲


标准I/O库不对字符进行缓存,直接调用系统调用

标准出错流stderr通常是不带缓冲区的,这使得出错信息能够尽快地显示出来。


二、清除和设置文件缓冲区


2.1 设置缓冲区函数


setbuf、setvbuf两个函数将使得打开文件后,用户可建立自己的文件缓冲区,而不使用fopen()函数打开文件设定的默认缓冲区。

void setbuf(FILE *stream,char *buf);

buf指出的缓冲区长度由头文件stdio.h中定义的宏BUFSIZE的值决定

当选定buf为空时,setbuf函 数将使的文件I/O不带缓冲

void setvbuf(FILE *stream,char *buf,int type,unsigned size);(经常)

由malloc函数来分配缓冲区。参数size指明了缓冲区的长度(必须大于0),而参数type则表示了缓冲的类型,

_IONBF:不缓冲

_IOLBF:行缓冲

_IOFBF:全缓冲

void main()
{
  //setbuf(stdout, NULL);//取消缓冲区
  stdvbuf(stdout, NULL, _IONBF, 0);
  printf("hello\n");
  while(1);
  //可以输出hello
}
void main()
{
  char *buf = (char *)malloc(sizeof(char) * 20)
  //setbuf(stdout, NULL);//取消缓冲区
  stdvbuf(stdout, buf, _IONBF, 20);
  printf("hello world");
  while(1);
  //可以输出hello world
}


原因:缓冲区不止有hello world,可能还有一些系统自加上去的,所以可以输出,50也可以,但是如果是200,就输出不了,一般是100起步


注意:fread是无缓冲的,所以效率会更高


fwrite有缓冲


2.2 清除文件缓冲区函数


int fflush(FILE *stream);

清除由strem指向的文件缓冲区里的内容。常用于写完些数据后,立即用该函数清除缓冲区,以免误操作时,破坏原来的数据

int flushall; 清除所有打开文件所对应的文件缓冲区。


三、应用场景(优化读写效率,适当调整缓冲区的大小)


如何提高文件的读写效率?

可以对缓冲区进行操作

改成无缓冲,用开销换时间,增大CPU开销,实现文件读写效率

增大缓冲区是减小开销,有可能,浪费

小文件不需要更改,超过几百兆,需要看是缓冲区的


内存的读写速度是远远大于磁盘的读写速度的


相关文章
|
3天前
|
存储 Java 编译器
Java文件IO操作基础
Java文件IO操作基础
6 0
|
4天前
|
消息中间件 关系型数据库 Kafka
实时计算 Flink版操作报错之在执行任务时遇到了一个IO错误,具体表现为无法从本地主机(localhost)下载文件,该怎么解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
4天前
|
安全 Linux vr&ar
【Linux 系统】基础 IO(动静态库)-- 详解
【Linux 系统】基础 IO(动静态库)-- 详解
|
4天前
|
存储 固态存储 Linux
【Linux 系统】基础 IO(文件系统 & inode & 软硬链接)-- 详解
【Linux 系统】基础 IO(文件系统 & inode & 软硬链接)-- 详解
|
6天前
|
存储 编译器 C语言
C语言进阶⑱(文件上篇)(动态通讯录写入文件)(文件指针+IO流+八个输入输出函数)fopen+fclose(下)
C语言进阶⑱(文件上篇)(动态通讯录写入文件)(文件指针+IO流+八个输入输出函数)fopen+fclose
14 0
|
6天前
|
C语言
C语言进阶⑱(文件上篇)(动态通讯录写入文件)(文件指针+IO流+八个输入输出函数)fopen+fclose(中)
C语言进阶⑱(文件上篇)(动态通讯录写入文件)(文件指针+IO流+八个输入输出函数)fopen+fclose
14 0
|
12天前
|
存储 缓存 安全
Java 中 IO 流、File文件
Java 中 IO 流、File文件
|
12天前
|
Java Unix Windows
|
2天前
|
存储 Java
Java IO流:深入解析与技术应用
Java IO流:深入解析与技术应用
109 1
|
4天前
|
存储 Java API
【JAVA学习之路 | 进阶篇】IO流及流的分类
【JAVA学习之路 | 进阶篇】IO流及流的分类

热门文章

最新文章