在linux系统中,open与fopen,read与fread,write与fwrite函数有着类似的功能,分别是打开文件、读取文件和写入文件的作用,但是他们之间的却别是什么呢?
由于这3组函数的差别方面是一样的,所以我们以read和fread为例进行说明
1、首先,fread是ANSI的C标准库函数,而read是linux系统的系统调用函数。fread更加通用,只要支持c编程的环境就能够支持fread函数的操作,而read函数只能在linux系统下使用。fread带有缓冲,是read的衍生,或者说fread是通过read实现的要想直接和硬件打交道,必须用read。
2、另一个区别
read/write 操作文件描述符 (int型)
fread/fwrite 操作文件流 (FILE*型)
为了理解这一点,我们先来看一下read函数的原型,如下所示。
ssize_t read(int fd ,void *buf, size_t count);
这个函数的定义比较容易理解,用于从文件描述符fd对应的文件读取数据,buf用来保存读取到的数据,读取的字节数为count。调用成功返回读出的字节数。出错返回-1。
我们再来看一下fread函数,原型定义如下
size_t fread(void *buffer,size_t size,size_t count,FILE *stream);
在这个而函数中,buffer为指向保存读取数据的缓冲区,size每次读取的字节数,count为最多读取的次数,sream为需要读取的文件流,函数返回读取的次数。
3、函数的使用方法
这两个函数使用方法实际上是比较类似的,为了便于理解,我们提供两个实例代码,供大家学习。
首先来看read函数的实例,如下为read_test.c文件
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
int main()
{
int num=0;
int count;
char buf[100];
//打开测试文件
int fd=open("testdata",O_RDONLY);
if(fd==-1)
{
printf("%s\n",strerror(errno));
}
else
{
printf("fd=%d\n",fd);
memset(buf,0,sizeof(buf));
while (1)
{
count=read(fd,buf,sizeof(buf)-1);
if(count<=0)
break;
num=num+count;
printf("%s",buf);
memset(buf,0,sizeof(buf));
}
//统计读取的总字节书
printf("num=%d\n",num);
}
close(fd);
}
在这个程序中,我们打开一个名字为testdata的文件,并读取文件中的数据,把读取的数据打印出来,直到读完为止,最后统计读取的总字节数据。
通过下面的命令编译源码,并生成可执行文件。
gcc read_test.c -o read_test
采用下面的命令执行程序,可以看到终端上打印处相应的信息。
./read_test
下面我们再来看一下,fread函数的实例,代码fread_test.c如下所示
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
int main(int arg,char *args[])
{
char buf[100];
size_t num=0;
size_t count;
FILE *p=fopen("testdata","r+");
if(p==NULL)
{
printf("Error: %s\n",strerror(errno));
}
else
{
memset(buf,0,sizeof(buf));
while(1)
{
count=fread(buf,1,sizeof(buf)-1,p);
if(count==0)
break;
num=num+count;
printf("%s",buf);
memset(buf,0,sizeof(buf));
}
printf("num=%d\n",num);
fclose(p);
}
}
这个程序实现的功能和上个实例是相同的,大家可以自己分析。采用同样的方法进行编译和运行,可以看到程序的运行结果。
在博客的资源中可以下载程序的源码进行测试。链接如下: