首页 > 解决方案 > 在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我的权限被拒绝。

标签: c

解决方案


有没有更好的方法来编写这段代码?

  • 您没有处理所有调用的错误。所有 syscall openwrite和return on errorread并设置 errno 并且可以随时执行此操作。可以处理。close-1EINTR
  • 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)系统调用,可用于在内核端附加数据以获得最大效率。

推荐阅读