-1

Что делает программа : На основе двух текстовых файлов, создает третий файл, в котором после каждой строки первого файла , пишется строка из второго файла.Программа предусматривает возможность , что один файл может содержать больше строк чем второй ( в этом случае содержимое файла с большим количество строк записывается в конец третьего)

Буду очень признателен за комментарии к коду!

int main()
{
FILE *f1 = fopen("F1.txt", "r");
FILE *f2 = fopen("F2.txt", "r");
FILE *f3 = fopen("F3.txt", "w");

if (!f1 || !f2 || !f3)
{
return 1;
}

char buf[510];

while (!feof(f1) && !feof(f2))
{
fgets(buf, 255, f1);

int len = strlen(buf);
fgets(buf+len, 510-len, f2);

fputs(buf, f3);
}

fclose(f2);

while (!feof(f1))
{
fgets(buf, 255, f1);
fputs(buf, f3);
}

fclose(f1);
fclose(f3);

return 0;

}
Harry
  • 221,325
  • 2
    Уж сколько раз твердили миру насчет while (!feof(f1))... См. https://ru.stackoverflow.com/q/833980/195342 – Harry Feb 13 '20 at 14:43

2 Answers2

3

Опять не пойму, зачем сложно, если можно просто - да еще и с ошибкой while (!feof(f1))... Комментировать неверный код не буду.

Раз так хочется именно голого C - ну что ж, давайте C.

#define  BUFSIZE  1024              // Размер буфера

int main()
{
    FILE
        *in0 = fopen("F1.txt","r"),  // Открыли файлы
        *in1 = fopen("F2.txt","r"),
        *out = fopen("F3.txt","w");

    if (!in0 || !in1 || !out) return 1;  // Вышли, если что-то не открылось

    for(; in0 || in1; )     // Пока есть хоть один открытый файл для чтения...
    {
        char buf[BUFSIZE];
        // Если файл открыт - читаем, проверяем. Считано - записываем строку, 
        // нет - значит, файл закончился. Закрываем, обнуляем указатель -
        // чтобы из этого файла больше не читать.
        if (in0) if(fgets(buf,BUFSIZE,in0)) fputs(buf,out); else { fclose(in0); in0 = NULL; }
        // Абсолютно то же самое для второго файла
        if (in1) if(fgets(buf,BUFSIZE,in1)) fputs(buf,out); else { fclose(in1); in1 = NULL; }
    }
    // Закрываем выходной файл
    fclose(out);
}
// Всё!

Можно было бы, кстати, in0 и in1 сделать массивом - было бы еще интереснее... типа

#define  BUFSIZE  1024

int main()
{
    FILE
        *in[2] = {fopen("F1.txt","r"),fopen("F2.txt","r")},
        *out = fopen("F3.txt","w");

    if (!in[0] || !in[1] || !out) return 1;

    for(int i = 0; in[0] || in[1]; i = 1-i)
    {
        char buf[BUFSIZE];
        if (in[i])
            if(fgets(buf,BUFSIZE,in[i])) fputs(buf,out);
            else { fclose(in[i]); in[i] = NULL; }
    }
    fclose(out);
}
Harry
  • 221,325
  • все прекрасно, только как сделать так, чтобы строки не дублировать в оперативной памяти ( тип не копировать в третий файл, а полностью переносить, чтобы два данных файла были потом пустые) ? – Halfpizods Feb 17 '20 at 17:47
  • Стереть файлы по окончанию работы. Если это нужно. И не уподобляться тому персонажу из анекдота, который спрашивал, как растянуть удовольствие и файлы стирать по байтику... Вы всерьез хотите как-то переписывать байты прямо на диске, не читая их в оперативную память? :) – Harry Feb 17 '20 at 18:32
1
int main()
{
    //отрываем файл f1 только для чтения (писать нельзя)
    FILE *f1 = fopen("F1.txt", "r");

    //отрываем файл f2 только для чтени (писать нельзя)
    FILE *f2 = fopen("F2.txt", "r");

    //отрываем файл f3 только для записи (читать нельзя)
    FILE *f3 = fopen("F3.txt", "w");

    if (!f1 || !f2 || !f3) //если хоть один файл не открылся, завершаем нашу программу с ошибкой
    {
        return 1;
    }

    char buf[510];

    while (!feof(f1) && !feof(f2)) //выполняем, пока не достигли конца f1 И f2
    {
        fgets(buf, 255, f1); //читаем в буфер из f1 (максимально 255 символов)

        int len = strlen(buf); //длинна прочитанного в буфер
        fgets(buf+len, 510-len, f2); //в конец буфера добавляем содержимое из f2 (не больше размера буфера)

        fputs(buf, f3); //записываем содержимое буфера в f3
    }

    fclose(f2); //закрываем файл f2, больше из него читать будет нельзя

    while (!feof(f1)) //читаем и записываем остаток содержимого f1 (если еще не прочитался)
    {
        fgets(buf, 255, f1); //читаем максимально 255 символов из f1
        fputs(buf, f3); //записываем в f3 то, что прочитали
    }

    fclose(f1); //закрываем f1
    fclose(f3); //закрываем f2

    return 0;

}
asianirish
  • 2,864