??我们打开了一个文件,可以使用write函数往该文件中写入数据。当我们往该文件中写入N个字节数据,位置pos会从0变为N,当我们再次往该文件中写入M个字节数据,位置会变为N+M。下面为write的示意图:
#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;
}
gcc -o write ./write.c
2. 运行程序
./write 1.txt hello xuchenyang
查看我们写入的文件:
cat 1.txt
??若是我们想在指定的位置写入字节,我们需要借助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。
gcc -o write_in_pos ./write_in_pos
./write_in_pos 1.txt
cat 1.txt
可以看到,我们在位置3出写入3个字节,但是后面3个字节不是插入而是被替代了。