2016-06-24 7 views
0

Я пытаюсь создать программу, которая берет ряд файлов и копирует их в другой.Объединение списка файлов в другой

, например

./foobar arch1.txt arch2.txt arch3.txt

необходимо создать arch3.txt с содержанием arch1.txt arch2.txt, archN.txt.

Это мой код:

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


void usage (char *argv[], int code) 
{ 
    printf("usage: %s [<file> <out_file>] \n", argv[0]); 
    exit(code); 
} 

void copyFile (FILE *ifp, FILE *ofp) 
{ 
    int c; 

    while ((c = fgetc(ifp)) != EOF) 
     fputc(c, ofp); 
} 

int main(int argc, char *argv[]) 
{ 
    system ("clear"); 

    FILE *fp, *fp2; 

    if (argc < 3) 
     usage(argv, EXIT_FAILURE); 
    else 
     if ((fp2 = fopen(argv[argc-1], "w")) == NULL) { 
        printf("Can't open file to write: %s\n", *argv); 
        exit(EXIT_FAILURE); 
      } 
     while(--argc > 0) 
      printf("%d",argc); 
      if ((fp = fopen(*++argv, "r")) == NULL) { 
       printf("Can't open file: %s\n", *argv); 
       exit(EXIT_FAILURE); 
      } 
      else { 
       copyFile(fp, fp2); 
       fclose(fp); 
       fclose(fp2);  
      } 
     return 0; 
} 

Мой Ouput:

Не удается открыть файл для записи: ./foobar

+0

См http://stackoverflow.com/a/3898070/5781248 –

ответ

0

Я установил его. Это некрасиво, но сейчас это работает.

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

void usage (char *argv[], int code) 
{ 
    printf("usage: %s [<file> <out_file>] \n", argv[0]); 
    exit(code); 
} 

void copyFile (FILE *ifp, FILE *ofp) 
{ 
    int c; 

    while ((c = fgetc(ifp)) != EOF) 
     fputc(c, ofp); 
} 

int main(int argc, char *argv[]) 
{ 
    FILE *f_read, *f_write; 

    int i; 

    if (argc < 3) 
     usage(argv, EXIT_FAILURE); 

    if ((f_write = fopen(argv[argc-1], "w")) == NULL) { 
     printf("Can't write in: %s\n", argv[argc-1]); 
     exit(EXIT_FAILURE); 
    } 

    for (i = 1; i < argc-1; ++i) 
    { 
     if ((f_read = fopen(argv[i], "r")) == NULL) { 
       printf("Can't open file: %s\n", argv[i]); 
       exit(EXIT_FAILURE); 
      } 
      else 
       copyFile(f_read, f_write); 
    } 
    fclose(f_read); 
    fclose(f_write); 
    return 0; 
} 
1

Это потому, что вы используете * ARGV для параметра filename в fopen(). Это должно быть argv [argc - 1].

+0

Кодекса перебирает вперед, так что вы хотели бы начать в -'argv [1] ', или данный метод итерации просто место' argv ++ 'перед вызовом' fopen() ' – Clifford

1

*argv не первый аргумент, а путь исполняемого файла.

Increment ARGV раз перед использованием его непосредственно:

argv++ ; 
    if ((fp2 = fopen(argv[argc-1], "w")) == NULL) { 

или, возможно, лучше использовать индексацию массива и начинать с argv[1].