read函数和fread函数的区别
来源:互联网 发布:实际投资算法 编辑:程序博客网 时间:2024/05/05 18:35
(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));//每次读取后清零buf if(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.cfd=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更好。
- fread函数和read函数的区别
- fread函数和read函数的区别
- read函数和fread函数的区别
- fread 和 read函数的区别
- fread与read的区别---open和fopen的区别--fread函数和fwrite函数
- fopen/fread/fwrite和open/read/write函数的区别
- open/read/write和fopen/fread/fwrite函数的区别
- fread 和 read的区别
- fread和read的区别
- fread和read的区别
- fread和read的区别
- fread函数和fwrite函数,read,write
- open/read/write和fopen/fread/fwrite函数的区别
- fread() fwrite()和write() read()的区别
- fread与read的区别
- fread与read的区别
- read与fread的区别
- read和recv等函数的区别
- Error vs Exception的区别?
- 高效开发习惯
- http协议
- 二维计算几何模板--圆
- Ubuntu建立wifi热点(支持Android手机)
- read函数和fread函数的区别
- python学习(10)————函数与模块
- iOS6与iOS7屏幕适配技巧
- lucene6.1.0 for linux 学习一:配置
- 150. Evaluate Reverse Polish Notation
- 随手敲代码——IOC猜想(终极版)
- Flume-ng集群安装文档
- MySQL数据库记录操作
- Matrix