文件操作中有两套函数,一套是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函数的区别