gpt4 book ai didi

将一个文件的数据复制到另一个文件

转载 作者:行者123 更新时间:2023-11-30 19:18:58 25 4
gpt4 key购买 nike

我正在尝试使用“C”将数据从一个文件复制到 UNIX 中的另一个文件。复制时的条件是1)源文件不存在2)源文件存在但目标文件不存在。 3) 如果源文件和目标文件都存在,则选择覆盖目标文件或将源文件数据附加到目标文件数据。

下面的代码对于前两种情况工作正常。但不适用于最后一种情况(覆盖和追加)。当我执行程序并输入现有源文件时,目标文件位置选择程序说数据已附加但实际上数据未附加或覆盖的选项之一。

请告诉我如何使程序在最后一种情况下正常工作。

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

#define BUFFSIZE 512
#define PERM 0644

int main (int argc, char *argv[])
{
char buffer[BUFFSIZE];
int infile;
int outfile;
int choice;
size_t size;

if((infile = open(argv[1], O_RDONLY,0)) < 0)
{
printf("Source file does not exist\n");
return -1;
}

if((outfile=open(argv[2],O_WRONLY,PERM))>0)

{
// printf("Destination Fiel Exists , Do you wish to Overwrite or Appened destination file Data : \n Enter 1 to overwrite or ,\n 0 to Append \n");
scanf("%d",&choice);

if(choice==1)
{
if((outfile=open(argv[2],O_WRONLY|O_CREAT |O_EXCL, PERM))>=0)
{
printf("Destination file data is overwriten by source file data \n");
return -2;
}
}// end if (choice =1)

else
{
if(choice==0)
{
if((outfile=open(argv[2],O_WRONLY |O_CREAT |O_APPEND, PERM ))>=0)
{
printf("Destination file data is appended with source file data : \n");
}
} // end if(choice==0)

else
{
printf("Entered invalid choice.: \n");
}
return -3;
}
}
else
{
if((outfile=open(argv[2],O_WRONLY | O_CREAT | O_EXCL,PERM))<0)
{
printf("Enter the desitination file along with source file \n");
return -4;
}
else {
printf(" Data has been copied to \t%s\n", argv[2]);
}
}

while ((size=read(infile, buffer, BUFFSIZE)) > 0)
{
write(outfile, buffer, size);
}

close(infile);
close(outfile);
return 0;

}

最佳答案

   if((outfile=open(argv[2],O_WRONLY|O_CREAT |O_EXCL, PERM))>=0)
{
printf("Destination file data is overwriten by source file data \n");
}

// instead use

if((outfile=open(argv[2],O_WRONLY|O_CREAT |O_TRUNC, PERM))>=0)
{
printf("Destination file data is overwriten by source file data \n");
}

有几点我想指出:

  1. 当尝试覆盖目标文件时,需要使用O_TRUNC而不是 O_EXCL。这样可以保证目标文件数据的长度设为0,然后将源文件复制到其中。
  2. 我还有使用 switch case 代替 if-else 子句以使其更容易阅读
  3. 当您使用“return”时,控件将返回到主窗口其余语句将不会被执行。

您可以使用 fread() 和 fwrite() 来加快任务完成速度。

关于将一个文件的数据复制到另一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25911250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com