open与fopen,read与fread,write与fwrite函数的区别

        在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);
	}

}

这个程序实现的功能和上个实例是相同的,大家可以自己分析。采用同样的方法进行编译和运行,可以看到程序的运行结果。

在博客的资源中可以下载程序的源码进行测试。链接如下:

https://download.csdn.net/download/bhniunan/12121787

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值