我正在尝试使用“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;
}
答案 0 :(得分: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");
}
// 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");
}
我想指出几点:
您可以使用fread()和fwrite()来更快地完成任务。
答案 1 :(得分:0)
<div>
<ul>
<li>abcd</li>
<li>b</li>
<li>cdefg</li>
<li>d</li>
</ul>
</div>
我想指出几点:
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");
}
// 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");
}
而不是O_TRUNC
。这将确保目标文件数据的长度为0,然后将源文件复制到其中。
2)我也使用了switch case而不是if-else子句来使它更容易阅读。
3)当你使用O_EXCL
时,控件返回到main,其余的语句将不会被执行。您可以使用return
和fread()
来更快地完成任务。