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

时间:2017-09-07 15:18:02

标签: c linux unix

我正在尝试编写一个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);
}

当我运行这样的程序时:

cc copyContents.c 
./a.out one.txt two.txt

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

当我在运行程序后查看two.txt的内容时,它几乎没有任何内容。只是一个空白文件。

我哪里错了?

4 个答案:

答案 0 :(得分:4)

你写了

 while((n1=read(fd1, buffer, 1024) > 0)){

而不是

 while ( (n1 = read(fd1, buffer, 1024)) > 0)

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

n1 = (read(fd1, buffer, 1024) > 0)

因此,读取正确完成,将其返回值与0进行比较,将比较结果(0或1)分配给n1

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

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

答案 1 :(得分:1)

Narenda 检查循环内是否有 n==-1,但是,循环测试是 n>0,因此,这永远不会发生。

此外,应在尝试写入之前测试错误读取。

答案 2 :(得分:0)

输入

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

void typefile (char *filename)
{
   int fd, nread;
   char buf[1024];
   fd = open (filename, O_RDONLY);
   if (fd == -1) {
   perror (filename);
   return;
}
while ((nread = read (fd, buf, sizeof (buf))) > 0)
   write (1, buf, nread);
   close (fd);
}
int main (int argc, char **argv)
{
  int argno;
  for (argno = 1; argno < argc; argno  )
  typefile (argv[argno]);
  exit (0);
}

输出

student@ubuntu:~$gcc –o prg10.out prg10.c
student@ubuntu:~$cat > ff
hello`enter code here`
hai
student@ubuntu:~$./prg10.out ff
hello
hai

答案 3 :(得分:0)

这是最好的解决方案,易于执行。

输入:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
int main(int argc, char *argv[])
 {
   int f1, f2;
   char buff[50];
   long int n;

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

 while((n=read(f1, buff, 50))>0)

     if(write(f2, buff, n)!=n)
        {
           perror("problem in writing");
           exit(3);
        }

     if(n==-1)
        {
           perror("problem in reading");
           exit(2);
        }

       close(f2);
       exit(0);
 }

输出:

cc sys.c 
./a.out a.txt b.txt
cat b.txt

因此,a.txt应该包含一些内容,并且此内容将被复制到b.txt 通过“ cat b.txt”,您可以交叉检查内容(在“ a.txt”中)。