700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Linux 系统编程 --文件IO-write() read() lseek()函数

Linux 系统编程 --文件IO-write() read() lseek()函数

时间:2020-04-24 14:57:47

相关推荐

Linux 系统编程 --文件IO-write() read() lseek()函数

author:zengzhi

1、write 函数

write(int fd, void *buf, size_t count ):

第一个参数:向哪一个文件中去写,用的是设备号;第二个参数:向这个文件中写什么内容,数组名就是一个首地址;第三个参数:向这个文件中写多少个。函数的返回值:是实际写的字节数。

//author:zengzhi#include <stdio.h>#include <unistd.h>#include <fcntl.h>int main(int argc,char *argv[]){int fd;int wr_ret;char buf[]="hello linux";fd=open("./a.c",O_TRUNC|O_RDWR);if(fd<0){printf("open a.c file fail\n");return -1;}printf("open a.c file suceess,fd=%d\n",fd);wr_ret=write(fd,buf,sizeof(buf));printf("wr_ret=%d\n",wr_ret);close(fd);return 0;}

运行的结果:

wr_ret=12是因为字符串尾部还有一个结束符。

2、read()

read(int fd, void *buf, size_t count)

第一个参数:从哪一个文件中去读, 用的是设备号;第二个参数:读到什么地方去;第三个参数:读多少个。函数的返回值:是实际读的字节数。

返回值:是实际读的字节数.

//author:zengzhi#include <stdio.h>#include <unistd.h>#include <fcntl.h>int main(int argc,char *argv[]){int fd;int wr_ret,rd_ret;char write_buf[]="hello linux";char read_buf[128]={0};fd=open("./a.c",O_TRUNC|O_RDWR);if(fd<0){printf("open a.c file fail\n");return -1;}printf("open a.c file suceess,fd=%d\n",fd);wr_ret=write(fd,write_buf,sizeof(write_buf));//start readrd_ret=read(fd,read_buf,128);printf("wr_ret=%d\n",wr_ret);printf("recv_data:read_buf=%s\n",read_buf);close(fd);return 0;}

实际的运行结果:

为什么会没读到?这是因为在写的时候,写位置指针指向的是写完数据的最后一个区域。开始读的时候,会接着写位置指针往下读,此时往下没有数据,因此读不到。所以需要调整文件指针的位置。需要用到lseek 函数。

3、lseek()函数

lseek(int fd, off_t offset, int whence),该函数的头文件:sys/types.h unistd.h;

功能:调整读写的位置指针;

第一个参数:要调整的文件的文件描述符;

第二个参数:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向后移,向前移);

第三个参数:当前位置的基点,有三个标志,

SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小;

SEEK_CUR:当前位置为文件指针的位置,新位置为当前位置加上偏移量。

SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小。函

数的

返回值:成功:文件当前的位置,出错:-1。

//author:zengzhi#include <stdio.h>#include <unistd.h>#include <fcntl.h>int main(int argc,char *argv[]){int fd;int wr_ret,rd_ret;char write_buf[]="hello linux";char read_buf[128]={0};fd=open("./a.c",O_TRUNC|O_RDWR);if(fd<0){printf("open a.c file fail\n");return -1;}printf("open a.c file suceess,fd=%d\n",fd);wr_ret=write(fd,write_buf,sizeof(write_buf));//start readlseek(fd,0,SEEK_SET);rd_ret=read(fd,read_buf,128);printf("wr_ret=%d\n",wr_ret);printf("recv_data:read_buf=%s\n",read_buf);close(fd);return 0;}

调整偏移位置:

//author:zengzhi#include <stdio.h>#include <unistd.h>#include <fcntl.h>int main(int argc,char *argv[]){int fd;int wr_ret,rd_ret;char write_buf[]="hello linux";char read_buf[128]={0};fd=open("./a.c",O_TRUNC|O_RDWR);if(fd<0){printf("open a.c file fail\n");return -1;}printf("open a.c file suceess,fd=%d\n",fd);wr_ret=write(fd,write_buf,sizeof(write_buf));//start readlseek(fd,2,SEEK_SET);rd_ret=read(fd,read_buf,128);printf("wr_ret=%d\n",wr_ret);printf("recv_data:read_buf=%s\n",read_buf);close(fd);return 0;}

//author:zengzhi#include <stdio.h>#include <unistd.h>#include <fcntl.h>int main(int argc,char *argv[]){int fd;int wr_ret,rd_ret;char write_buf[]="hello linux";char read_buf[128]={0};fd=open("./a.c",O_TRUNC|O_RDWR);if(fd<0){printf("open a.c file fail\n");return -1;}printf("open a.c file suceess,fd=%d\n",fd);wr_ret=write(fd,write_buf,sizeof(write_buf));//start readlseek(fd,-3,SEEK_CUR);rd_ret=read(fd,read_buf,128);printf("wr_ret=%d\n",wr_ret);printf("recv_data:read_buf=%s\n",read_buf);close(fd);return 0;}

运行结果:尾部有一个结束符。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。