天天看点

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

           

运行的结果:

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

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

           

实际的运行结果:

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

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

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

调整偏移位置:

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

           
Linux 系统编程 --文件IO-write()、read()、lseek()函数
//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;
	
} 

           

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

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

继续阅读