read、write和lseek
时间:2010-11-03 来源:1987hanen
read、write和lseek
(1)read、write和lseek函数作用
read函数是用于将指定的文件描述符中读出数据。当从终端设备文件中读出数据时,通
常一次最多读一行。
write函数是用于向打开的文件写数据,写操作从文件的当前位移量处开始。若磁盘已满
或超出该文件的长度,则write函数返回失败。
lseek函数是用于在指定的文件描述符中将文件指针定位到相应的位置。
(2)read和write函数格式
read函数的语法格式如下.
read函数语法要点
所需头文件#include <unistd.h>
函数原型ssize_t read(int fd,void *buf,size_t count)
fd:文件描述符
函数传入值buf:指定存储器读出数据的缓冲区
count:指定读出的字节数
函数返回值
成功:读到的字节数
0:已到达文件尾
-1:出错
在读普通文件时,若读到要求的字节数之前已到达文件的尾部,则返回的字节数会小于
希望读出的字节数。
write函数的语法格式如下表6.4 所示。
write函数语法要点
所需头文件#include <unistd.h>
函数原型ssize_t write(int fd,void *buf,size_t count)
fd:文件描述符
函数传入值buf:指定存储器写入数据的缓冲区
count:指定读出的字节数
函数返回值
成功:已写的字节数
-1:出错
在写普通文件时,写操作从文件的当前位移处开始。
lseek函数的语法格式如下表6.5 所示。
lseek函数语法要点
所需头文件
#include <unistd.h>
#include <sys/types.h>
函数原型off_t lseek(int fd,off_t offset,int whence)
fd:文件描述符
函数传入值offset:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可
负(向前移,向后移)
续表
SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小
SEEK_CUR:当前位置为文件指针的位置,新位置为当前位置加上
偏移量
whence:
当前位置
的基点SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏
移量的大小
函数返回值
成功:文件的当前位移
-1:出错
(3)函数使用实例
该示例程序首先打开上一节中创建的文件,然后对此文件进行读写操作(记得要将文件
打开属性改为可读写,将文件权限也做相应更改)。接着,写入“Hello! I'm writing to this file!”,
此时文件指针位于文件尾部。接着在使用lseek 函数将文件指针移到文件开始处,并读出10
个字节并将其打印出来。程序源代码如下所示:
/*write.c*/
#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
int main(void)
{
int i,fd,size,len;
char *buf="Hello! I'm writing to this file!";
char buf_r[10];
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\n",fd);
/*调用write函数,将buf中的内容写入到打开的文件中*/
if((size = write( fd, buf, len)) < 0){
perror("write:");
exit(1);
}
else
printf("Write:%s\n",buf);
/*调用lsseek函数将文件指针移到文件起始,并读出文件中的10个字节*/
lseek( fd, 0, SEEK_SET );
if((size = read( fd, buf_r, 10))<0){
perror("read:");
exit(1);
}
else
printf("read form file:%s\n",buf_r);
if( close(fd) < 0 ){
perror("close:");
exit(1);
}
else
printf("Close hello.c\n");
exit(0);
}