[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.
举个例子:
做如下步骤的操作:
- 打开文件
- 读文件的0k~4k(read or fread)
- 其他操作
- 读文件的1k~3k(read or fread)
- 关闭文件
这时候如果是read,步骤4要调用内核;而如果是fread,因步骤2在应用层已经缓冲所需内容,数据会直接返回,无需再次调用内核
[Linux]read/write和fread/fwrite有什么区别的更多相关文章
- linux缓冲的概念fopen /open,read/write和fread/fwrite区别
fopen /open区别 UNIX环境下的C 对二进制流文件的读写有两套班子:1) fopen,fread,fwrite ; 2) open, read, write这里简单的介绍一下他们的区别.1 ...
- Linux read/write fread/fwrite两者区别
Linux read/write fread/fwrite两者区别 1,fread是带缓冲的,read不带缓冲. 2,fopen是标准c里定义的,open是POSIX中定义的. 3,fread可以读一 ...
- 那些年,坑死自己的事之fread/fwrite
今天继续看牛人做过的东西,这个小程序并不大,加上相当多的注释行,才5000多行.这个小程序是在linux下实现的,之前自己也一直用vi来看并加以更加详细的注释,但是效率实在太低.于是将其转移到wind ...
- fopen /open,read/write和fread/fwrite区别
fopen /open,read/write和fread/fwrite区别 转载URL:http://hi.baidu.com/%B9%C8%C9%F1%B2%BB%CB%C0jdp/ ...
- read/write/fsync与fread/fwrite/fflush的关系和区别
read/write/fsync: 1. linux底层操作: 2. 内核调用, 涉及到进程上下文的切换,即用户态到核心态的转换,这是个比较消耗性能的操作. fread/fwrite/fflush: ...
- linux系统——fread()与read()函数族区别
fread与read区别: 1,fread是带缓冲的,read不带缓冲. 2,fopen是标准c里定义的,open是POSIX中定义的. 3,fread可以读一个结构.read在linux/unix中 ...
- fread/fwrite
fread/fwrite第二个参数和第三个参数的区别以及与返回值的关系 size_t fwrite_unlocked(const void * __restrict ptr, size_t size, ...
- fread/fwrite实现复制功能
1. fread/fwrite实现复制功能 #include <stdio.h> #include <stdlib.h> #define BUFFSIZE 4096 //执行 ...
- C++fread/fwrite的基础用法
前言 fread是吼东西 应某人要求(大概)科普一下 fread #include <iostream> #include <cstdlib> #include <cst ...
随机推荐
- CentOS6.4下Samba服务器的安装与配置
一.先恶狠狠地吐槽一下: 这篇随笔真是让我折腾了2天2夜才敢下笔写!!!为什么呢?之前是通过去Samba的官网下载的源码包,也就是.tar.gz来进行安装配置,不过这个让我折腾来折腾去就是没折腾出结果 ...
- HTML-获取/修改html页面标题
作为一个标准的HTML文档,网页标题(title)是必不可少的属性.随着浏览器的发展,我们又多了一种访问和修改文档的方式:DOM.所以我们获取网页标题的方式大致可分为以下两种: 通过document对 ...
- [Grunt] Concatenating Your Javascript with grunt-contrib-concat
Combine serval javascript files together. For angular project, make sure you add angular.min.js firs ...
- TCP/IP编程 - 1) 基础知识
1. What Is a Socket?(什么是套接字) A socket is an abstraction through which an application may send and re ...
- 一个完整的C++程序SpreadSheet - 1) 类的声明和定义
1. SpreadsheetCell.h #pragma once #include <string> class SpreadsheetCell { public: void setVa ...
- windows下flv视频网站进度条随意拖放[转]
网站中视频都转换成flv格式,奈何flv格式无法拖拽,此问题纠结了好久,最终得以解决.现将解决思路记录下来,大多数源于网上找到的. 视频拖拽满足要求 1.播放器要支持 2.flv视频要有关键帧和met ...
- .NET设计规范一:设计规范基础
http://www.cnblogs.com/yangcaogui/archive/2012/04/18/2447049.html 前一段时间阅读了“.NET设计规范”这本书,读后给我的感觉是规范对开 ...
- 谁占用了我的Buffer Pool?--【转】
转自:http://blogs.msdn.com/b/apgcdsd/archive/2011/01/11/buffer-pool.aspx 我在做SQL Server 7.0技术支持的时候有客户问我 ...
- iOS开发之UITableView的使用
这一篇记录的是iOS开发中UITableView的使用,iOS中的UITableView跟Android中的ListView特别相似,以下用一个Demo来说明: 1.Xcode中新建projectTe ...
- 便捷的 chrome/Firefox扩展
chrome: 1.Postman-REST Client 模拟发送post/get请求测试接口很好用 2.Edit This Cookie 管理cookie 3.json-handle / jso ...