read函数和fread函数的区别
(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函数的区别相关推荐
- php中fread()函数,php fread()函数
定义 fread()函数用于读取文件. 语法 PHP fread()函数具有以下语法. fread(file,length) 参数 参数 是否必须 描述 file 需要. 要读取的打开文件 lengt ...
- fwrite函数,fread函数和fgets函数详解以及使用方法
c/c++文件处理函数 1. fgets函数 函数原型 char *fgets(char *s, int size, FILE *stream); 参数解释: s 代表要保存到的内存空间的首地址,可以 ...
- fopen()、fwrite()、fread()函数使用说明与示例
fopen()函数: 1.作用: 在C语言中fopen()函数用于打开指定路径的文件,获取指向该文件的指针. 2.函数原型: FILE * fopen(const char * path,const ...
- render函数和redirect函数的区别+反向解析
render函数和redirect函数的区别+反向解析 1.视图函数:一定是要包含两个对象的(render源码里面有HttpResponse对象) request对象:----->所有的请求 ...
- 友元函数、类的非静态成员函数、静态成员函数的区别
类中申明的函数相对于类来说有三层意思: 1.有this指针 2.函数在类的作用区域中 3.可以访问类中私有部分 4.可以被继承 非静态成员函数具有1234 静态成员函数具有234 友元函数具有3 静态 ...
- Python初探——sklearn库中数据预处理函数fit_transform()和transform()的区别
敲<Python机器学习及实践>上的code的时候,对于数据预处理中涉及到的fit_transform()函数和transform()函数之间的区别很模糊,查阅了很多资料,这里整理一下: ...
- 第七周项目一-成员函数、友元函数和一般函数有区别(1)
/**Copyright(c)2016,烟台大学计算机与控制工程学院*All rights reserved*文件名称:123.cpp*作 者:王蕊*完成日期:2016年4月12日*版 本 号: ...
- js函数声明和函数表达式的区别
Javascript Function无处不在,而且功能强大!通过Javascript函数可以让JS具有面向对象的一些特征,实现封装.继承等,也可以让代码得到复用.但事物都有两面性,Javascrip ...
- python中remove函数是什么意思,python中pop函数和remove函数有什么区别
python中pop函数和remove函数有什么区别 发布时间:2020-12-10 09:36:18 来源:亿速云 阅读:80 作者:小新 小编给大家分享一下python中pop函数和remove函 ...
最新文章
- 英特尔联合Facebook研发AI芯片:CPU老厂能在AI时代打好翻身仗吗
- @Mybatis传多个参数
- 索爱麦克风免驱动的语音录入测试
- batch size 越大,学习率也要越大
- OpenCV 进阶应用,用编程手段搞定图像处理
- python信息找人的算法_算法篇-python查找算法
- ActiveMQ_Windows版本的安装部署
- MySQL流浪记(四)—— DDL和DML区别与介绍
- Firefox鼠标手势插件在哪安装 火狐浏览器鼠标手势怎么用
- xp本地服务器虚拟目录创建,WindowsXp系统怎么创建虚拟目录
- 51Nod 1182
- wordpress靶机快速搭建
- 【leetcode】722. Remove Comments
- 使用Object、param标签在页面显示PDF文件
- 记录一下我的游戏私服搭建(台服dnf)
- python中interval_Python 数值区间处理_对interval 库的快速入门详解
- 小小靖Java成长日记02
- 网易MUMU模拟器怎么设置不卡?
- 大学的治理与改革—张维迎
- css 随机 数,纯CSS实现随机效果