使用标准 I/O 和系统调用制作文件副本的 C 程序

The*_*oom 1 c unix linux

我正在尝试编写一个 C 程序,它使用标准 I/O 和系统调用来执行将一个文件的内容复制到另一个文件。

到目前为止,我已经这样做了:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
    int fd1, fd2;
    char buffer[1024];
    long int n1;

    if(((fd1 = open(argv[1], O_RDONLY)) == -1) || ((fd2=open(argv[2],O_CREAT|O_WRONLY|O_TRUNC, 0700)) == -1)){
        perror("file problem");
        exit(1);
    }

    while((n1=read(fd1, buffer, 1024) > 0)){
        if(write(fd2, buffer, n1) != n1){
            perror("writing problem ");
            exit(3);
        }
    }
    close(fd1);
    close(fd2);
}
Run Code Online (Sandbox Code Playgroud)

当我像这样运行程序时:

cc copyContents.c 
./a.out one.txt two.txt
Run Code Online (Sandbox Code Playgroud)

假设one.txt定义明确,我想要的是创建一个名为的新文件two.txt并复制所有内容one.txt

当我查看two.txt运行程序后的内容时,它实际上什么都没有。只是一个空白文件。

我哪里错了?

Jab*_*cky 5

你写了

 while((n1=read(fd1, buffer, 1024) > 0)){
Run Code Online (Sandbox Code Playgroud)

代替

 while ( (n1 = read(fd1, buffer, 1024)) > 0)
Run Code Online (Sandbox Code Playgroud)

在您的代码中,while条件代码 int归结为:

n1 = (read(fd1, buffer, 1024) > 0)
Run Code Online (Sandbox Code Playgroud)

所以读取正确完成,它的返回值与 0 进行比较,比较的结果(0 或 1)被分配给n1.

这再次表明以一种使其可读的方式格式化代码是多么重要。

您可以自己使用调试器或通过printf在代码中插入一两个s 来轻松调试。

  • ..或者只是通过不编写可能(并且确实)出错的“聪明”复合表达式来完全避免这个问题:( (3认同)