使用读写系统调用连接文件

时间:2018-07-11 05:01:52

标签: c read-write

我写了这个简单的代码来连接两个文件。为什么不起作用?请帮忙。

int main(int arg, char* argv[]){  
    int fd1, fd2;  
    char c;  
    fd1 = open(argv[1], O_APPEND);  
    fd2 = open(argv[2], O_RDONLY);  
    while(read(fd2, &c, sizeof(c))) {  
        write(fd1, &c, sizeof(c));  
    }  
    close(fd1);  
    close(fd2);  
    return 0;  
}  

1 个答案:

答案 0 :(得分:1)

正如我在评论中指出的那样:

  

您需要测试open()write()的结果。您与O_APPEND的通话也需要O_WRONLY。而且,如果您也希望它创建文件,则还需要其他各种选项-O_CREAT;也许O_TRUNC,但可能不是;也许O_EXCL;也许还有一些其他参数,而第三个参数则需要模式参数(例如0644,所有者可以读取或写入,组只能读取,其他则只能读取;或者更具限制性)。

您还需要检查是否有2个文件名参数。

解决这些问题会导致类似于以下代码:

int main(int arg, char* argv[]){  
    if (argc < 3)
    {
        fprintf(stderr, "Usage: %s out-file in-file\n", argv[0]);
        return 1;
    }
    int fd1 = open(argv[1], O_APPEND|O_WRONLY|O_CREAT, 0644);
    if (fd1 < 0)
    {
        fprintf(stderr, "%s: failed to open/create file %s for writing\n", argv[0], argv[1]);
        return 1;
    }
    int fd2 = open(argv[2], O_RDONLY);  
    if (fd2 < 0)
    {
        fprintf(stderr, "%s: failed to open file %s for reading\n", argv[0], argv[2]);
        return 1;
    }
    char c;
    while (read(fd2, &c, sizeof(c)) == sizeof(c)) {  
        if (write(fd1, &c, sizeof(c)) != sizeof(c))
            break;  
    }  
    close(fd1);  
    close(fd2);  
    return 0;  
}

我注意到,您可能会收到有关将签名和未签名值与read()write()测试进行比较的警告-函数返回ssize_t,而sizeof会生成{{ 1}}(2对1个字母size_t)。您可以解决这个问题,但这很丑陋。该代码效率也很差。单个字符的读取和写入工作正常,但缓冲区大小在1 KiB至4 KiB甚至更大的范围内,通常可以获得明显更好的性能。当然,那么您必须捕获并使用s返回的值,以便写入正确数量的数据。

请注意,如果read()失败(返回read()),原始代码将继续循环。仅当-1到达EOF时成功返回read()时,它才会停止。