文件I/O(不带缓冲)之read函数

调用read函数从打开文件中读数据。

#include <unistd.h>
ssize_t read( int filedes, void *buf, size_t nbytest );

返回值:若成功则返回读到的字节数,若已读到文件结尾则返回0,若出错则返回-1。

有多种情况可是实际读到的字节数少于要求读的字节数:

  • 读普通文件时,在读到要求字节数之前已到达了文件尾端。
  • 当从终端设备读时,通常一次最多读一行。
  • 当从网络读时,网络中的缓冲机构可能造成返回值小于所要求读到字节数。
  • 当从管道或FIFO读时,如若管道包含的字节数少于所需的数量,那么read将只返回实际可用的字节数。
  • 当从某些面向记录的设备(例如磁带)读时,一次做多返回一个记录。
  • 当某一信号造成中断,而已经读了部分数据量时。

读操作从文件的当前偏移量处开始,在成功返回之前,该偏移量将增加实际读到的字节数。

POSIX.1从几个方面对read函数的原型作了更改。其经典定义是:

int read( int filedes, char *buf, unsigned nbytes );
  • 首先,为了与ISO C保持一致,将第二个参数由char *改为void *。在ISO C中,类型void *用于表示通用指针。
  • 其次,其返回值必须是一个带符号整数(ssize_t),以返回正字节数、0(表示文件尾端)或-1(出错)。
  • 最后,第三个参数在历史上是一个不带符号整数,这允许一个16位的实现一次读或写的数据可以多达65534个字节。在1990 POSIX.1标准中,引入了基本系统数据类型ssize_t以提供带符号的返回值,不带符号的size_t则用于第三个参数。

本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/

原文地址:https://www.cnblogs.com/nufangrensheng/p/3498122.html