2014-09-18 2 views
-1

Я пытаюсь скопировать данные из одного файла в другой файл в UNIX с помощью «C». Условие во время копирования: 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; 

} 

ответ

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"); 
    } 

Есть несколько моментов, я хотел бы отметить:

  1. При попытке перезаписи целевого файла, вам нужно использовать O_TRUNC вместо O_EXCL. Это гарантирует, что длина данных целевого файла будет равна 0, а затем будет скопирован исходный файл.
  2. Также я используется переключатель случай вместо if-либо еще положений, чтобы сделать его проще прочитать
  3. При использовании «возвращение», управление переходит обратно к главному и остальные заявления не будет казнены.

Вы можете использовать функции fread() и fwrite(), чтобы задачи выполнялись быстрее.

+0

Я пробовал ваше предложение, пока оно не работает. – user2515280

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) Также я использовал случай с переключателем вместо предложений if-else, чтобы было легче читать.

3) При использовании return, управление возвращается к основной и остальной части заявления, не будут выполнены. Вы можете использовать fread() и fwrite(), чтобы выполнить задачи быстрее.

Смежные вопросы