Прошу написать комментрии к коду, не могу понять этот алгоритм!
Что делает программа : На основе двух текстовых файлов, создает третий файл, в котором после каждой строки первого файла , пишется строка из второго файла.Программа предусматривает возможность , что один файл может содержать больше строк чем второй ( в этом случае содержимое файла с большим количество строк записывается в конец третьего)
Буду очень признателен за комментарии к коду!
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);
}