原文出处:http://blog.chinaunix.net/space.php?uid=20558494&do=blog&id=2803003
read函数是Linux下不带缓存的文件I/O操作函数之一,所谓的不带缓存是指一个函数只调用系统中的一个函数。另外还有open、write、lseek、close,它们虽然不是ANSI C的组成部分,但是POSIX的组成部分。
在对read的使用过程中,发现对其返回值的处理比较重要,这里做一下总结。
read函数原型:
ssize_t read(int fd,void *buf,size_t count)
函数返回值分为下面几种情况:
1、如果读取成功,则返回实际读到的字节数。这里又有两种情况:一是如果在读完count要求字节之前已经到达文件的末尾,那么实际返回的字节数将 小于count值,但是仍然大于0;二是在读完count要求字节之前,仍然没有到达文件的末尾,这是实际返回的字节数等于要求的count值。
2、如果读取时已经到达文件的末尾,则返回0。
3、如果出错,则返回-1。
这样也就是说分为>0 <0 =0三种情况进行讨论。在有的时候,<0 =0可以合为一种情况进行处理。这要根据程序的需要进行处理。
实例分析:
#include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #define MAXSIZE 35 int main(void) { int i,j,fd,size,len; char *buf="Hello!I`m writing to this file!"; char buf_r[MAXSIZE]; len=strlen(buf); //open if((fd=open("/tmp/hello.c",O_CREAT | O_TRUNC | O_RDWR,0666))<0) { perror("open:"); exit(1); } else printf("Open file:hello.c %d ",fd); //write if((size=write(fd,buf,len))<0){ perror("write:"); exit(1); } else printf("Write:%s ",buf); //test-read printf("Now test starts... "); for(i=0;i<20;i++){ lseek(fd,0,SEEK_SET); for(j=0;j<MAXSIZE;j++) buf_r[j]=0; if((size=read(fd,buf_r,MAXSIZE-i))<0){ perror("read:"); exit(1); } else { buf_r[MAXSIZE-i]='