我写了这个简单的代码来连接两个文件。为什么不起作用?请帮忙。
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;
}
答案 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()
时,它才会停止。