C语言文件操作:读取两个文件内容并拼接写入第三个文件
"#include <sys/types.h>\n#include <sys/stat.h>\n#include <fcntl.h>\n#include <unistd.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <strings.h>\n\n#define PATH1 "1.txt"\n#define PATH2 "2.txt"\n#define PATH3 "3.txt"\n\nint main(int argc, char const *argv[]) {\n int fd1 = open(PATH1, O_RDWR | O_CREAT, 0777); //创建并打开1.txt\n if (fd1 == -1) {\n printf("open %s failed\n", PATH1);\n exit(-1);\n }\n\n int fd2 = open(PATH2, O_RDWR | O_CREAT, 0777); //创建并打开1.txt\n if (fd2 == -1) {\n printf("open %s failed\n", PATH2);\n exit(-1);\n }\n\n int fd3 = open(PATH3, O_RDWR | O_CREAT, 0777);\n if (fd3 == -1) {\n printf("open %s failed\n", PATH3);\n exit(-1);\n }\n\n char buf1[100];\n printf("请输入hello: ", buf1);\n scanf("%s", buf1);\n\n write(fd1, buf1, strlen(buf1)); // 将用户输入的hello写入到fd1\n\n char buf2[100];\n printf("请输入world: ", buf2);\n scanf("%s", buf2);\n\n write(fd2, buf2, strlen(buf2)); // 将用户输入的world写入到fd2\n\n lseek(fd1, 0, SEEK_SET); // 将fd1的文件指针移到文件开头\n lseek(fd2, 0, SEEK_SET); // 将fd2的文件指针移到文件开头\n\n char buf3[100];\n bzero(buf3, sizeof(buf3)); // 清空buf3\n\n int read_return = read(fd1, buf3, sizeof(buf3) - 1); // 从fd1读取内容到buf3\n if (read_return == -1) {\n printf("read %s failed\n", PATH1);\n exit(-1);\n }\n\n read_return = read(fd2, buf3 + strlen(buf3), sizeof(buf3) - strlen(buf3) - 1); // 从fd2读取内容追加到buf3\n if (read_return == -1) {\n printf("read %s failed\n", PATH2);\n exit(-1);\n }\n\n printf("拼接后的内容: %s\n", buf3);\n\n write(fd3, buf3, strlen(buf3)); // 将拼接后的内容写入fd3\n\n close(fd1);\n close(fd2);\n close(fd3);\n\n return 0;\n}\n\nread_return = read(fd2, buf3 + strlen(buf3), sizeof(buf3) - strlen(buf3) - 1); // 从fd2读取内容追加到buf3\n这段代码中为什么要加strlen(buf3)\n\n在这段代码中,strlen(buf3)的作用是获取buf3已经写入的内容的长度。由于buf3是一个字符数组,每次往其中写入数据时,都会从buf3当前内容的末尾开始写入,因此需要将文件指针移动到buf3的末尾,即buf3 + strlen(buf3),然后再从这个位置开始读取fd2的内容。这样可以保证新读取的内容追加在buf3的末尾,实现了拼接的效果。
原文地址: https://www.cveoy.top/t/topic/qj9K 著作权归作者所有。请勿转载和采集!