Linux IO系统编程系列课程笔记之read() 和write() 函数

本文详细解析了Linux环境下文件操作的核心函数read和write的使用方法及注意事项,包括函数原型、参数解析、返回值意义以及特殊情况下数据读写的影响因素。

前言
每一个打开的文件都有唯一一个文件指针来记录当前文件数据的位置

  • read函数
    函数原型
 ssize_t  read (int fd,  void *buff,  size_t count)
 参数解析:
 fd: 源文件的描述符
 buff:文件内容读取放置的目标位置
 count: 期望读到的字节数

注:
ssize_t是有符号整型,在32位机器上等同与int,在64位机器上等同与long int
size_t是无符号整型,至于是long型,还是int型,可能不同的编译器有不同的定义
返回值为实际读到的字节数,而第三个参数为希望读取的字节数,以下情况为特殊情况:

当前文件指针到了文件末尾,读取结束时实际读到的字节数少于期望读取的字节数

当读取终端设备时一般一次只能读取一行(buff为行缓存)

当读取网络数据时网络缓冲区大小或已存在的数据字节数小于期望读取的字节数大小

在进程当中由于中断导致读取结束,使得当前读取到的字节数少于期望读取到的字节数

在某些记录型设备例如磁带,一次只能返回一个记录
总之:
影响实际读到的数据的因素大概为:文件所在的载体的缓冲区大小、当前文件指针位置。
实际读取到的字节数计量方式: 文件指针的位移量,文件指针开始的位置我们可以自定义例如用lseek()函数,这就不多讲

  • write函数
    函数原型
 ssize_t write(int fd,  const void *buff,  size_t count)
 参数解析:
 fd:  写入文件的文件描述符
 buff: 存放待写入的数据的缓冲区
 count:期望一次写入数据的大小

注意

  1. 当返回值和第三个参数不一样则会出错,表示数据并没有完全写入:一般在如下情况会出错:
    目标位置容量已满
    或超出了对一个给定进程的文件长度限制
  2. 对于写入文件的开始位置取决于文件打开时所加的参数:如果指定了O_APPEND(追加)则从文件末尾开始写入,如果没有指定则从文件开始的位置写入文件,写入文件后,文件的指针往后移动写入的字节数的位移大小,类似的也可以指定写入文件的位置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值