[Linux]read/write和fread/fwrite有什么区别

转自:http://blog.csdn.net/xiaofei0859/article/details/51145051

二者都是对文件进行操作,那么二者有什么区别,用的时候该如何选择呢?

1. 区别

  • fread是带缓冲的,read不带缓冲.
  • fopen是标准c里定义的,open是POSIX中定义的.
  • fread可以读一个结构.read在Linux/unix中读二进制与普通文件没有区别.
  • fopen不能指定要创建文件的权限.open可以指定权限.
  • fopen返回指针,open返回文件描述符(整数).
  • linux/unix中任何设备都是文件,都可以用open,read.

如果文件的大小是8k。

你如果用read/write,且只分配了2k的缓存,则要将此文件读出需要做4次系统调用来实际从磁盘上读出。

如果你用fread/fwrite,则系统自动分配缓存,则读出此文件只要一次系统调用从磁盘上读出。

也就是用read/write要读4次磁盘,而用fread/fwrite则只要读1次磁盘。效率比read/write要高4倍。

如果程序对内存有限制,则用read/write比较好。

都用fread 和fwrite,它自动分配缓存,速度会很快,比自己来做要简单。如果要处理一些特殊的描述符,用read 和write,如套接口,管道之类的

系统调用write的效率取决于你buf的大小和你要写入的总数量,如果buf太小,你进入内核空间的次数大增,效率就低下。而fwrite会替你做缓存,减少了实际出现的系统调用,所以效率比较高。

如果只调用一次(可能吗?),这俩差不多,严格来说write要快一点点(因为实际上fwrite最后还是用了write做真正的写入文件系统工作),但是这其中的差别无所谓。

2.来自论坛的解释

fread带缓存指的是应用层带缓存,read也是带了缓存但是指的是系统层或者说kernel层,当然也可能不带,比如直接DMA,由驱动决定。

fread是标准库的缓冲,read是内核的缓冲。

read/write如果可以精确控制一次读写的数据,则会比fread/fwrite更加高效

read/write对应Linux中的system call, 而fread/fwrite则可以说是对read/write的又一次封装,read/write更加原生,如果不考虑跨平台,建议多使用read/write.

举个例子

做如下步骤的操作:

  1. 打开文件
  2. 读文件的0k~4k(read or fread)
  3. 其他操作
  4. 读文件的1k~3k(read or fread)
  5. 关闭文件

这时候如果是read,步骤4要调用内核;而如果是fread,因步骤2在应用层已经缓冲所需内容,数据会直接返回,无需再次调用内核

时间: 2024-08-27 06:30:48

[Linux]read/write和fread/fwrite有什么区别的相关文章

Linux read/write fread/fwrite两者区别

Linux read/write fread/fwrite两者区别 1,fread是带缓冲的,read不带缓冲. 2,fopen是标准c里定义的,open是POSIX中定义的. 3,fread可以读一个结构.read在linux/unix中读二进制与普通文件没有区别. 4,fopen不能指定要创建文件的权限.open可以指定权限. 5,fopen返回指针,open返回文件描述符(整数). 6,linux/unix中任何设备都是文件,都可以用open,read. 如果文件的大小是8k. 你如果用r

那些年,坑死自己的事之fread/fwrite

今天继续看牛人做过的东西,这个小程序并不大,加上相当多的注释行,才5000多行.这个小程序是在linux下实现的,之前自己也一直用vi来看并加以更加详细的注释,但是效率实在太低.于是将其转移到windows下决定改造到VS2012下运行. 这是一段纯C的代码,新建的工程是C++的,而代码中使用了强制类型转换将一个结构体类型转换成了另一个结构体.于是编译的时候报错不能通过.最后,我新建了空工程,将其以已存在的文件的形式导入,解决了这个问题.修改了一些问题之后,终于不报错,可以运行了.可是真正悲催的

fread/fwrite实现复制功能

1.  fread/fwrite实现复制功能 #include <stdio.h> #include <stdlib.h> #define BUFFSIZE 4096 //执行: ./a.out file1 file2 //功能: 将file1的内容读取出来,写入file2,即复制 int main(int argc,char *argv[]) { char buffer[BUFFSIZE]; FILE *pRead,*pWrite; //读文件指针 写文件指针 int n; //

Linux系统函数read()/write()/pread()/pwrite()的区别-(转自CSDN网络)

在Linux和UNIX中有很多的输入输出函数,有时真是让想跟它攀点关系的菜鸟们束手无策.先来看看都有哪些函数,通过解析与总结,看看能不能让大家能这些函数有个理性的认识,哦,原来是这么回事,也就算我没白花这份闲. 内核文件I/O->标准库I/O->高级I/O->IPC中 1.         read()/write(); 2.         pread()/pwrite(); 3.         getc()/putc(); 4.         fgetc()/fputc(); 5

fread与read的区别(文件io补充)

这里有一个我们经常提出的问题就是fread,read的区别.(当然这两个分别代表了操作文件系统的两套不同的函数,包括open,read, write, seek 等). 一.他们的区别就是一个(read)是UNIX 中的系统调用,是类UNIX系统,提供给程序员操作文件的接口(要不然你如何操作文件?):而另外一个则是C语言提供的读取文件的函数库,自然这个函数库(ANSI)的实现是以对应的系统调用为基础的. 二.fread有缓冲(准确的说法是缓冲的空间不同) 这里说缓冲,其实read函数也有缓冲(但

linux的sleep()和usleep()的使用和区别

linux的sleep()和usleep()的使用和区别 关键词: linux sleep() usleep() sleep函数 usleep功能把进程挂起一段时间, 单位是微秒(百万分之一秒): 头文件: unistd.h 语法: void usleep(int micro_seconds); 返回值: 无 内容说明:本函数可暂时使程序停止执行.参数 micro_seconds 为要暂停的微秒数(us). 注意:这个函数不能在windows操作系统下运行 Sleep(unisgned long

Linux实际操作中命令 su 与 sudo 的区别

------------------------------------------------------------------------------------------------ 首先我先做了一些更改操作: 换到root用户的操作=>sudo su输入当前用户的密码: ****** 修改root密码的操作=>passwd 123456 /* root密码已改为123456 */ [email protected] chenwei <www.chenwei.ws>---

在linux中,rpm和yum有什么区别?

rpm就是安装一个指定的包,但如果包存在依赖性关系,就是安装A包,需要先安装B包,采用rpm就要先安装B,再安装A:而yum能自动检测包之间的依赖关系,可以直接yum安装A,yum检测到A与B 的依赖关系,自动安装B: Linux中的rpm 英文原义:RPM  Package  Manager         中文释义:RPM软件包管理器 注解:一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中.它生成具有.RPM扩展名的文件. RPM是RedHat软件包管理工具的缩写,这一文

linux中ctrl+z和ctrl+c的区别

ctrl+c和ctrl+z都是中断命令,但是他们的作用却不一样.ctrl+c是强制中断程序的执行,而ctrl+z的是将任务中断,但是此任务并没有结束,他仍然在进程中他只是维持挂起的状态,用户可以使用fg/bg操作继续前台或后台的任务,fg命令重新启动前台被中断的任务,bg命令把被中断的任务放在后台执行.例如:当你vi一个文件是,如果需要用shell执行别的操作,但是你又不打算关闭vi,因为你得存盘推出,你可以简单的按下ctrl+z,shell会将vi进程挂起~,当你结束了那个shell操作之后,