Прошу написать комментрии к коду, не могу понять этот алгоритм!

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

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

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;

}

Ответы (2 шт):

Автор решения: asianirish
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;

}
→ Ссылка
Автор решения: Harry

Опять не пойму, зачем сложно, если можно просто - да еще и с ошибкой 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);
}
→ Ссылка