• [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在应用层已经缓冲所需内容,数据会直接返回,无需再次调用内核

  • 相关阅读:
    loadView和viewDidLoad的官方API的一些解释
    面向对象IOS编程中的聚合与耦合
    史上最全的iOS面试题及答案
    oc的基本数据的转换
    NSDateFormatter时间函数
    图片点击放大,再次点击返回原视图.完美封装,一个类一句代码即可调用.IOS完美实现
    同一ViewController内如果有两处AlertView要用代理Delegate怎么写法
    简单实现---下拉刷新 --使用UITableViewController中的refreshControl属性
    简单实现---上拉加载刷新---
    洛谷2863 [Usaco06JAN]牛的舞会
  • 原文地址:https://www.cnblogs.com/aaronLinux/p/6685520.html
Copyright © 2020-2023  润新知