菜鸟学C_read()和fread()函数

内容分享1个月前发布
0 4 0

我们必须会遇到的一个问题就是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,由于字符串结尾标志为‘’,占用一个字节,否则会出现乱码。

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更好。

© 版权声明

相关文章

4 条评论

您必须登录才能参与评论!
立即登录
  • 头像
    温江八三汽车电子八三锁业 读者

    查CentOS7的man 3 read ,里面说是POSIX接口。

    无记录
  • 头像
    HQ527527 投稿者

    POSIX标准的文件接口有:close、creat、open、read、sync、write、dup、dup2、flock、fcntl、fsync、lseek、mkstemp等。

    无记录
  • 头像
    沈胜国律师 读者

    read不是POSIX标准接口,它只是unix的接口,它使用整数类型的fd作为上下文,fd只在*Unix系统中存在。fread是POSIX接口,它使用FILE*作为上下文。

    无记录
  • 头像
    王晏美医生 投稿者

    fread是POSIX接口

    无记录