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 read
	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;
	
} 

实际的运行结果:
在这里插入图片描述为什么会没读到?这是因为在写的时候,写位置指针指向的是写完数据的最后一个区域。开始读的时候,会接着写位置指针往下读,此时往下没有数据,因此读不到。所以需要调整文件指针的位置。需要用到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 read
	lseek(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 read
	lseek(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 read
	lseek(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;
	
} 

运行结果:尾部有一个结束符。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值