大家好,欢迎来到IT知识分享网。
我们必须会遇到的一个问题就是fread,read的区别。这两个函数分别代表了操作文件系统的两套不同的函数,包括open,read, write, seek 等。同样的fwrite、write等一系列函数都是如此的区别。
一.他们的区别就是一个(read)是UNIX 中的系统调用,是类UNIX系统,提供给程序员操作文件的接口(要不然你如何操作文件呢);而另外一个(fread)则是C语言提供的读取文件的函数库,自然这个函数库(ANSI)的实现是以对应的系统调用为基础的。
二.fread有缓冲(准确的说法是缓冲的空间不同)
这里说缓冲,其实read函数也有缓冲(但是很多人说没有,根据资料,read是系统函数,而内核在读取硬盘(外设设备)时,自己也会缓冲读写),但是fread缓存在用户空间,而read是缓存在内核。所以如果使用read读一个文件时,通常需要更多的访问cpu,而fread可以较少访问cpu次数,进而提高效率。所以,如果文件需要进用户程序,你一般使用fread较好,而你只是单纯地复制的话,就是从这块磁盘到另一块磁盘,那就一般是使用read较好,因为这样可以避免数据进入用户空间,内核直接实现,效率更高。
fread和read的不同点
1)
read/write 操作文件描述符 (int型)
fread/fwrite 操作文件流 (FILE*型)
2)
fread/fwrite 调用 read/write
read/write是系统调用,要自己分配缓存,也就是说效率要自己根据实际情况来控制。
fread/fwrite是标准输入/输出函数,不需要自己分配缓存,对于一般情况具有较高的效率。
格式区别
read:
ssize_t read(int fd ,void *buf, size_t count);
read用于从文件描述符对应的文件读取数据,调用成功返回读出的字节数;buf为读出数据的缓冲区,count为每次读取的字节数,出错返回-1,EOF返回0。
例如:一个文件大小600字节,每次读取400字节,则第一次读取返回400,第二次读取返回200,并且要注意如果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,1,10,p);
用法差异
效率:fread为封装好的库函数,而read为系统函数,一般来说,fread效率更高。
读取文件差别:fread功能更强大,可以的结构体的二进制文件。如果底层的操作,用到文件描述符,用read更好。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/170217.html