天天看點

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()函數

繼續閱讀