前言
每一个打开的文件都有唯一一个文件指针来记录当前文件数据的位置
- 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:期望一次写入数据的大小
注意
- 当返回值和第三个参数不一样则会出错,表示数据并没有完全写入:一般在如下情况会出错:
目标位置容量已满
或超出了对一个给定进程的文件长度限制 - 对于写入文件的开始位置取决于文件打开时所加的参数:如果指定了O_APPEND(追加)则从文件末尾开始写入,如果没有指定则从文件开始的位置写入文件,写入文件后,文件的指针往后移动写入的字节数的位移大小,类似的也可以指定写入文件的位置