c - 在C中将两个文件合并为写入和读取
问题描述
我想使用open
和文件描述符合并两个文件。此外,我想-
在编写第二个文件的内容之前将第一个文件的内容与第二个文件的内容分开。
我做了以下事情:
void merge (char* fileName, char *fileName1) {
int fd = open(fileName, O_RDWR);
char c;
while (read(fd, c, 1) > 0) {//going at the end of the first file
}
char next[] = "\n";
char charc[] = "-";
write (fd, next, strlen(next));
for (int i = 0; i < 80; i++) {
if (write (fd, charc, strlen(charc)) == -1) {
perror("error : ");
}
}
write (fd, next, strlen(next));
int fd1 = open(fileName1, O_RDWR);
while(read(fd1, &c, 1) > 0) {
write(fd, &c, sizeof(c));
}
close(fd1);
close(fd);
}
有没有更好的方法来编写这段代码?此外,即使它有效,我也有一个小问题,似乎我无权读取新文件。例如,如果我这样做,cat newFile
我的权限被拒绝。
解决方案
有没有更好的方法来编写这段代码?
- 您没有处理所有调用的错误。所有 syscall
open
、write
和return on errorread
并设置 errno 并且可以随时执行此操作。可以处理。close
-1
EINTR
going at the end of the first file
open
具有O_APPEND
用于附加数据的标志模式。- 一次复制一个字符是非常不理想的。使用 glibc 标准库,您可以
BUFSIZ
一次使用字节来选择快速 I/O 输出。您可以一次复制一个大块大小的副本,它是 2 的幂,例如 2048 或 4096。 - 这里几乎没有理由使用文件描述符 - 更喜欢使用标准
FILE *
处理,这将使您的代码可移植并缓冲数据以实现更快的 I/O。 - 如果您希望创建文件,请使用
O_CREAT
并添加第三个参数open
是新文件的权限掩码。 - 在 linux 上有splice(2)系统调用,可用于在内核端附加数据以获得最大效率。
推荐阅读
- typescript - 通过在 Typescript 中维护具有不同类型的 Order 来定义数组
- javascript - Javascript数组通过另一个元素获取一个元素
- python - 如果我们使用 Covolutional LSTM + Conv2D,如何处理图像和过滤器的大小?
- python - 如何将 Django 2.2 与旧版 PostgreSQL 8.4 数据库一起使用?
- javascript - 如何为不同的构建类型/风格构建 react-native 组件?
- maven-2 - Maven - 不从 https://repo1.maven.org/maven2 下载,但尝试从 http://repo1.maven.org/maven2 下载
- html -
- python - 每个 open() 语句行为的一个读取操作的解释?
- python-3.x - 创建图像堆栈
- sql - 在 Sqlite 中使用 REGEX 匹配和替换字符串?