2016-06-30 2 views
0

Я пытаюсь создать функцию, которая берет ряд файлов и записывает содержимое каждого из них в новое.Слияние двух файлов на треть в C (fread и fwrite)

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

    void file_copy(FILE *f1, FILE *f2) { 
    char buffer[BUFFER_SIZE]; 
    size_t sz; 
    sz = fread(buffer, sizeof(buffer),1,f1); 
    while (sz == 1) { 
     fwrite(buffer, sz,1,f2); 
     sz = fread(buffer, sizeof(buffer),1,f1); 
    } 
} 

int main(int argc, char const *argv[]) 
{ 
    FILE *f_in, *f_out; 
    int i; 
    if (argc < 3) 
    { 
     puts("Not enough arguments."); 
     exit(1); 
    } 

    if ((f_out = fopen(argv[argc-1], "w")) == NULL) 
    { 
     printf("Can't open %s for writing.\n", argv[argc-1]); 
     exit(1); 
    } 

    for (i = 0; i < argc-1; ++i) 
    { 
     if ((f_in = fopen(*++argv, "r")) == NULL) 
     { 
      printf("Can't open %s for reading\n", *argv); 
      exit(1); 
     } 
     else 
      file_copy(f_in, f_out); 
     close(f_in); 
     close(f_out); 
    } 


    return 0; 
} 

и я не получаю вывод в своем выходном файле. Кажется, они закрывают их в самый раз.

+0

[? Почему «(! Feof (файл)) в то время как» всегда ошибочно] (HTTP : //stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong) – kaylum

+1

Я думаю, что вы дезинформировали, что возвращает 'fread()'. Он возвращает количество прочитанных элементов. В вашем заявлении размер равен 1024, поэтому ожидайте возврат «1», означающий чтение 1024 байта или «0», менее 1024 байт. Если вы поменяли размер и количество, то значение, возвращаемое 'fread()', будет выровнено по вашему ожиданию. Значение, если вы попытаетесь прочитать 1024 элемента размером 1 байт, тогда значение вернет способ чтения байтов. – alvits

+0

Я изменил свою функцию и все еще не работает. – Telefang

ответ

1

Вы планировали сохранить текст из списка файлов в th e последний файл? Это не совсем понятно. Существует множество проблем с кодом, кроме нечитаемого синтаксиса. Вы должны использовать fclose вместо close. И чтение нескольких байтовых элементов вместо одного элемента гигантского массива.

Вот фиксированный код:

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

void file_copy(FILE *f1, FILE *f2) { 
    char buffer[1024]; 
    ssize_t sz; 

    while (!feof(f1)) { 
     sz = fread(buffer, 1, sizeof(buffer), f1); 

     fwrite(buffer, 1, sz, f2); 
    } 
} 

int main(int argc, char const *argv[]) 
{ 
    FILE *f_in, *f_out; 
    int i; 
    if (argc < 3) 
    { 
     puts("Not enough arguments."); 
     exit(1); 
    } 

    if ((f_out = fopen(argv[argc-1], "w")) == NULL) 
    { 
     printf("Can't open %s for writing.\n", argv[argc-1]); 
     exit(1); 
    } 

    for (i = 1; i < argc-1; i++) 
    { 
     if ((f_in = fopen(argv[i], "r")) == NULL) 
     { 
      printf("Can't open %s for reading\n", *argv); 
      exit(1); 
     } 
     else 
     { 
      file_copy(f_in, f_out); 
      fclose(f_in); 
     } 
    } 
    fclose(f_out); 

    return 0; 
} 
+0

'argc' - это счетчик. 'argv' в массиве с индексом. Таким образом, последним элементом будет 'argv [argc-1]'. https://stackoverflow.com/questions/3024197/what-does-int-argc-char-argv-mean – ilya1725

1

Есть Несколько не удается:

  1. буфер должен быть выделен каким-то образом
  2. write должен написать число прочитанных байт, а не полный буфер

Так оно и должно быть так:

#define BUF_SIZE 1024 

void file_copy(FILE *f1, FILE *f2) { 
    char buffer[BUF_SIZE]; 

    while (!feof(f1)) { 
     size_t r = fread(buffer, 1, sizeof(buffer), f1); 
     fwrite(buffer, 1, r, f2); 
    } 
} 
+0

Я пробовал это, и теперь он ничего не пишет о файле. – Telefang

+0

Возможно, у вас есть другая ошибка вне этой функции. Возможно, не закрывать файл. – krzydyn

+0

Я разместил свой полный код там, я не думаю, что это проблема. – Telefang

0

Вы должны определенно знать, сколько писать, потому что вы в конечном итоге написание 1024 байт, независимо от того, что, как это происходит сейчас.

В зависимости от того, какого типа вы имеете дело с файлами, это вариант для TXT-файлов, по крайней мере:

void file_copy(FILE *f1, FILE *f2) { 

    fseek(f1, 0, SEEK_END); 
    int buf_size = ftell(f1); 
    char buf[buf_size]; 

    //Reset file position 
    fseek(f1, 0, SEEK_SET); 
    sz = fread(buf, sizeof(buf), 1, f1); 
    fwrite(buf, sz, 1, f2); 
} 
+0

Это ударит, когда вы попытаетесь скопировать DVD-файл iso. Никогда не рекомендуется буферировать весь файл. Цикл while будет выполняться только один раз, потому что весь файл считывается в буфер. Зачем даже использовать петлю? – alvits

+0

Обнаружил, что теперь, уточненный тип файла, удалит цикл, моя ошибка @alvits – Aleins

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