Linux系统调用接口---使用write函数写文件

Linux系统调用接口—使用write函数写文件

1 wirte函数介绍

  我们打开了一个文件,可以使用write函数往该文件中写入数据。当我们往该文件中写入N个字节数据,位置pos会从0变为N,当我们再次往该文件中写入M个字节数据,位置会变为N+M。下面为write的示意图:
Linux系统调用接口---使用write函数写文件_第1张图片

2 代码实现

#include 
#include 
#include 
#include 
#include 
#include 
#include 

/*
 * ./write 1.txt str1 str2
 * argc >= 3
 * argv[0] = "./write"
 * argv[1] = "1.txt"
*/

int main(int argc,char** argv)
{
	int fd;
	int i;
	int len;
	
	if(argc < 3)
	{
		printf("Usage: %s    ...\n",argv[0]);
		return -1;
	}

	fd = open(argv[1],O_RDWR | O_CREAT | O_TRUNC,0644);
	if(fd < 0)
	{
		printf("can not open file %s\n",argv[1]);
		printf("errno :%d\n",errno);
		printf("err :%s\n",strerror(errno));
		perror("open");
	}
	else 
	{
		printf("fd = %d\n",fd);
	}

	for(i=2;i<argc; i++)
	{
		len = write(fd,argv[i],strlen(argv[i]));
		if(len != strlen(argv[i]))
		{
			perror("write");
			break;
		}
		write(fd,"\r\n",2);
	}
	
	close(fd);
	
	return 0;
}
  1. 编译代码
gcc -o write ./write.c

在这里插入图片描述
2. 运行程序

./write 1.txt hello xuchenyang

Linux系统调用接口---使用write函数写文件_第2张图片
查看我们写入的文件:

cat 1.txt

Linux系统调用接口---使用write函数写文件_第3张图片

3 在指定位置写文件

  若是我们想在指定的位置写入字节,我们需要借助lseek命令。

  • 查看lseek帮助
man lseek

Linux系统调用接口---使用write函数写文件_第4张图片

  通过帮助信息,我们可以对lseek函数进行以下总结:

函数 函数原型 描述
lseek #include
#include
off_t lseek(int fd,off_t offset,int whence);
作用:重新定位读/写文件偏移
fd:指定要偏移的文件描述符
offset:文件偏移量
whence:开始添加偏移offset的位置
SEEK_SET,offset相对于文件开头进行偏移
SEEK_CUR,offset相对于文件当前位置进行偏移
SEEK_END,offset相对于文件末尾进行偏移
  • 编写代码
#include 
#include 
#include 
#include 
#include 
#include 
#include 

/*
 * ./write_in_pos 1.txt
 * argc = 2
 * argv[0] = "./write_in_pos"
 * argv[1] = "1.txt"
*/

int main(int argc,char** argv)
{
	int fd;
	
	if(argc != 2)
	{
		printf("Usage: %s \n",argv[0]);
		return -1;
	}

	fd = open(argv[1],O_RDWR | O_CREAT,0644);
	if(fd < 0)
	{
		printf("can not open file %s\n",argv[1]);
		printf("errno :%d\n",errno);
		printf("err :%s\n",strerror(errno));
		perror("open");
	}
	else 
	{
		printf("fd = %d\n",fd);
	}

	printf("lseek to offset 3 from file head\n");
	lseek(fd,3,SEEK_SET);

	write(fd,"123",3);
	
	close(fd);
	
	return 0;
}

通过这段代码,我们将向pos->3的位置写入123。

  • 实验验证
  1. 编译代码
gcc -o write_in_pos ./write_in_pos
  1. 运行程序
./write_in_pos 1.txt

在这里插入图片描述

cat 1.txt

Linux系统调用接口---使用write函数写文件_第5张图片
可以看到,我们在位置3出写入3个字节,但是后面3个字节不是插入而是被替代了。

你可能感兴趣的:(linux)