read、write和lseek

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);

}

作者: 1987hanen   发布时间: 2010-11-03