(1)格式

read:
ssize_t read(int fd ,void *buf, size_t count);
read用于从文件描述符对应的文件读取数据,调用成功返回读出的字节数;buf为读出数据的缓冲区,count为每次读取的字节数,出错返回-1,EOF返回0。
例如:一个文件大小600字节,每次读取400字节,则第一次读取返回400,第二次读取返回300,并且要注意如果buf为一个数组,每次读取的count最大为sizeof(buf)-1,因为字符串结尾标志为‘\0’,占用一个字节,否则会出现乱码。
fread:
size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream);
ptr为指向缓冲区保存或读取的数据。
size为控制记录大小。
nmemb为记录数。
函数返回读取或回写的记录数。
例如:
char buf[100];
size_t temp=fread(buf,10,1,p);
这个语句表示,每次读取10个字节到buf里边(10×1),如果读取的字节数少于10个返回0,因此,如果想知道读取文件的具体字节数,需要将上边的语句改为:
size_t temp=fread(buf,10,1,p);

(2)代码比较

通过read和fread计算返回的字节数和显示读取的文件内容。

#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[]){int num;if(arg<2)return 0;int fd=open(args[1],O_RDONLY);if(fd==-1){printf("%s\n",strerror(errno));}else{printf("fd=%d\n",fd);char buf[100];memset(buf,0,sizeof(buf));while (1) {int temp=read(fd,buf,sizeof(buf)-1);//注意这里num=num+temp;printf("%s",buf);memset(buf,0,sizeof(buf));//每次读取后清零bufif(temp<=0)//当文件读取结束时,退出循环break;}printf("num=%d\n",num);}close(fd);
}

我们首先通过 ls -l查看要读取的read.c文件的大小为688字节。

xin@xin-Lenovo-V3000:~/code/test$ ls -l
总用量 28
-rw-rw-r-- 1 xin xin   175 8月  21 17:00 makefile
-rwxrwxr-x 1 xin xin 10504 8月  21 17:49 read
-rw-rw-r-- 1 xin xin   688 8月  21 17:49 read.c
-rw-rw-r-- 1 xin xin  4728 8月  21 17:49 read.o

然后运行make程序:

xin@xin-Lenovo-V3000:~/code/test$ ./read read.c
fd=3
#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[]){int num;if(arg<2)return 0;int fd=open(args[1],O_RDONLY);if(fd==-1){printf("%s\n",strerror(errno));}else{printf("fd=%d\n",fd);char buf[100];memset(buf,0,sizeof(buf));while (1) {int temp=read(fd,buf,sizeof(buf)-1);num=num+temp;printf("%s",buf);memset(buf,0,sizeof(buf));if(temp<=0)break;}printf("num=%d\n",num);}close(fd);
}
num=688

我们发现fd=3,因为每个进程启动时都打开三个文件,标准输入文件(stdin),标准输出文件(stdout),标准出错文件(stderr),这三个文件分别对应文件描述符0,1,2。因此再打开文件的话,按顺序fd=3。
注意:如果关闭标准输出:
close(STDOUT_FILENO);则1空闲,再次打开的文件描述符为1。
num=688与实际字节数相同。

fread用法:

#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[]){FILE *p=fopen(args[1],"r+");if(p==NULL){printf("error is %s\n",strerror(errno));}else{char buf[100];memset(buf,0,sizeof(buf));size_t rc=0;while(1){size_t temp=fread(buf,1,10,p);rc=rc+temp;printf("%s",buf);memset(buf,0,sizeof(buf));if(temp==0)break;}printf("rc=%d\n",rc);fclose(p);}}

返回688字节。结果和read的相同。

(3)用法差异

效率:fread为封装好的库函数,而read为系统函数,一般来说,fread效率更高。
读取文件差别:fread功能更强大,可以的结构体的二进制文件。如果底层的操作,用到文件描述符,用read更好。

read函数和fread函数的区别相关推荐

  1. php中fread()函数,php fread()函数

    定义 fread()函数用于读取文件. 语法 PHP fread()函数具有以下语法. fread(file,length) 参数 参数 是否必须 描述 file 需要. 要读取的打开文件 lengt ...

  2. fwrite函数,fread函数和fgets函数详解以及使用方法

    c/c++文件处理函数 1. fgets函数 函数原型 char *fgets(char *s, int size, FILE *stream); 参数解释: s 代表要保存到的内存空间的首地址,可以 ...

  3. fopen()、fwrite()、fread()函数使用说明与示例

    fopen()函数: 1.作用: 在C语言中fopen()函数用于打开指定路径的文件,获取指向该文件的指针. 2.函数原型: FILE * fopen(const char * path,const ...

  4. render函数和redirect函数的区别+反向解析

    render函数和redirect函数的区别+反向解析 1.视图函数:一定是要包含两个对象的(render源码里面有HttpResponse对象)   request对象:----->所有的请求 ...

  5. 友元函数、类的非静态成员函数、静态成员函数的区别

    类中申明的函数相对于类来说有三层意思: 1.有this指针 2.函数在类的作用区域中 3.可以访问类中私有部分 4.可以被继承 非静态成员函数具有1234 静态成员函数具有234 友元函数具有3 静态 ...

  6. Python初探——sklearn库中数据预处理函数fit_transform()和transform()的区别

    敲<Python机器学习及实践>上的code的时候,对于数据预处理中涉及到的fit_transform()函数和transform()函数之间的区别很模糊,查阅了很多资料,这里整理一下: ...

  7. 第七周项目一-成员函数、友元函数和一般函数有区别(1)

     /**Copyright(c)2016,烟台大学计算机与控制工程学院*All rights reserved*文件名称:123.cpp*作 者:王蕊*完成日期:2016年4月12日*版 本 号: ...

  8. js函数声明和函数表达式的区别

    Javascript Function无处不在,而且功能强大!通过Javascript函数可以让JS具有面向对象的一些特征,实现封装.继承等,也可以让代码得到复用.但事物都有两面性,Javascrip ...

  9. python中remove函数是什么意思,python中pop函数和remove函数有什么区别

    python中pop函数和remove函数有什么区别 发布时间:2020-12-10 09:36:18 来源:亿速云 阅读:80 作者:小新 小编给大家分享一下python中pop函数和remove函 ...

最新文章

  1. 英特尔联合Facebook研发AI芯片:CPU老厂能在AI时代打好翻身仗吗
  2. @Mybatis传多个参数
  3. 索爱麦克风免驱动的语音录入测试
  4. batch size 越大,学习率也要越大
  5. OpenCV 进阶应用,用编程手段搞定图像处理
  6. python信息找人的算法_算法篇-python查找算法
  7. ActiveMQ_Windows版本的安装部署
  8. MySQL流浪记(四)—— DDL和DML区别与介绍
  9. Firefox鼠标手势插件在哪安装 火狐浏览器鼠标手势怎么用
  10. xp本地服务器虚拟目录创建,WindowsXp系统怎么创建虚拟目录
  11. 51Nod 1182
  12. wordpress靶机快速搭建
  13. 【leetcode】722. Remove Comments
  14. 使用Object、param标签在页面显示PDF文件
  15. 记录一下我的游戏私服搭建(台服dnf)
  16. python中interval_Python 数值区间处理_对interval 库的快速入门详解
  17. 小小靖Java成长日记02
  18. 网易MUMU模拟器怎么设置不卡?
  19. 大学的治理与改革—张维迎
  20. css 随机 数,纯CSS实现随机效果

热门文章

  1. Rpgmakermv(38)MOG_Theatrhythm
  2. 电子邮件(E-mail)证据若干问题研究
  3. Petalinux建立工程时出现WARNING: /bin/sh is not bash!的解决方法
  4. 在visio中插入数学公式
  5. kali linux 修改用户名密码
  6. DAY 9 | 自学前端第九天
  7. 支付项目:9、购物车模块
  8. 3 个 Linux 中快速检测端口的小技巧
  9. SRAM DRAM SDRAM DDR2 LPDDR2 PSRAM RLDRAM的区别和联系
  10. linux vsftp查看ftp账号信息的方法