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

2023-12-14 04:55:46

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

1 wirte函数介绍

??我们打开了一个文件,可以使用write函数往该文件中写入数据。当我们往该文件中写入N个字节数据,位置pos会从0变为N,当我们再次往该文件中写入M个字节数据,位置会变为N+M。下面为write的示意图:
在这里插入图片描述

2 代码实现

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>

/*
 * ./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 <file> <string1> <string2> ...\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

在这里插入图片描述
查看我们写入的文件:

cat 1.txt

在这里插入图片描述

3 在指定位置写文件

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

  • 查看lseek帮助
man lseek

在这里插入图片描述

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

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

/*
 * ./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 <file>\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

在这里插入图片描述
可以看到,我们在位置3出写入3个字节,但是后面3个字节不是插入而是被替代了。

文章来源:https://blog.csdn.net/weixin_47268803/article/details/134959665
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。