带缓冲的IO和不带缓冲的IO

  文件操作中有两套函数,一套是C库中的 fopen()fread()…,还有一套是linux的系统调用 open()read()
  虽然都是实现文件操作,但它们之间还是有一些不同。或许在网上我们会查到:fopen()fread()…是缓冲系统的调用,open()read()…是非缓冲系统的调用。那么这的 缓冲 到底是什么意思呢?


先上代码:

(1)C库函数调用

#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
	char buf; //建立缓冲区
	FILE* source, * backup; //设立FILE结构指针
	if ((source = fopen("file.txt", "r")) == NULL) //若以只读形式source.dat成功打开,则fopen()返回FILE指针source
	{
		printf("Error in opening file.\n");
		exit(1);
	}
	if ((backup = fopen("backup_c.txt", "w")) == NULL) //若以只写形式backup.dat无法打开,则创建文件不成功
	{
		printf("Error in creating file.\n");
		exit(1);
	}

	int flag=1; //判断是否备份成功
	while (fread(&buf, sizeof(buf), 1, source) == 1) //用fread函数读取source的一个buf大小的数据到缓冲区
	{
		if (fwrite(&buf, sizeof(buf), 1, backup) == 0) //用fwrite函数把一个buf大小的缓冲区数据写入backup
		{//若写入错误,则打印“写入文件错误”
			flag=0;
			printf("Error in wrinting file.\n");
			exit(1);
		}
	}
	if(flag) 
		printf("备份完成!");
	if (ferror(source)) //读取文件source出现错误 
	{
		printf("Error in reading file.\n");
		exit(1);
	}
	if (fclose(source)) //source流的关闭出现错误
	{
		printf("Error in close file.\n");
		exit(1);
	}
	if (fclose(backup)) //backup流的关闭出现错误
	{
		printf("Error in close file.\n");
		exit(1);
	}
	return 0;
}

(1)linux系统调用

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main(){
    //打开文件
    int src = open("file.txt",O_RDONLY);//以只读形式打开test文件,返回一个文件描述符
    int dest = open("backup_linux.txt",O_RDWR|O_CREAT,0644);//读写方式打开,644是权限

    //读取test内容,写入copy_test
    char buf[2];//定义字符缓冲数组,用于存放读取到的文件内容
    int read_size,write_size = 0;
    while((read_size = read(src,buf,1))!= 0)//返回0说明读取完毕
    {
        write_size += write(dest,buf,read_size);
    }
    printf("写入文件内容大小为:%d\n",write_size);

    //关闭文件
    close(src);
    close(dest);
    return 0;
}

  在上面的两份代码中,我们发现其实它们都需要一个称之为缓冲区的东西来暂存文件内容,

C库函数调用.c

char buf; //建立缓冲区
linux系统调用.c

char buf[2];//定义字符缓冲数组,用于存放读取到的文件内容

但是,此缓冲非彼缓冲,“缓冲系统”、“非缓冲系统”中的“缓冲”与上面代码中的“缓冲区”,这两个概念是不同的。

  所谓非缓冲系统是指用户层没有缓存,通过系统调用直接对磁盘文件进行读写,但是对于内核来说,还是进行了缓存,内核现将数据写到内核缓冲存储器中,当缓冲存储器溢出时再进行实际的IO操作,缓冲系统是指在用户层建立一个流缓存区,库函数向流缓存区读写数据,流缓存区溢出时进行系统调用,即再调用无缓冲的IO。



两个系列函数的区别:

引用资料:
带缓冲的IO和不带缓冲的IO
open/read/write和fopen/fread/fwrite函数的区别

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫咪钓鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值