Чтение файлов и вывод в stdout - C (СИ)
Формулировка задачи:
Необходимо выводить два файла по строке в следующем порядке: 1 строка 1 файла - 1 строка второго файла - 2 строка первого файла - 2 строка 2 файла ... и т.д.
Вывод получается следующим:
В двух файлах записано по две строки. В одном строки цифр 1 и 2, в другом- строки букв a и b. Не имею представления, по какой причине программа делит строки и не чередует их. Также не ясны причины пробелов.
#include <stdio.h>
#include <stdlib.h>
//#include <string.h>
#define MAX 100
int main(int argc, char **argv)
{
char * string1 = (char*)malloc(MAX*sizeof(char));
char * string2 = (char*)malloc(MAX*sizeof(char));
int count1, count2;
FILE *fp, *fa;
if(argc < 2)
{
fprintf(stderr, "Вы не ввели имена файлов в качества аргументов\n");
}
if(argc < 3)
{
fprintf(stderr, "Вы не ввели имя второго файла в качества аргумена\n");
}
if ((fp = fopen(argv[1], "r")) == NULL || (fa = fopen(argv[2], "r")) == NULL)
{
fprintf(stderr, "Ошибка при открытии файлов\n");
exit(1);
}
while(fgets(string1, sizeof(string1), fp) || fgets(string2, sizeof(string2), fa))
{
if(string1 == '\0' && string2 != '\0')
{
fputs(string2, stdout);
}
else if(string1 != '\0' && string2 == '\0')
{
fputs(string1, stdout);
}
else
{
fputs(string1, stdout);
fputs(string2, stdout);
}
}
free(string1);
free(string2);
if(fclose(fp) != 0 || fclose(fa) != 0)
{
fprintf(stderr, "Ошибка при закрытии файла.\n");
}
return 0;
}
1111111111111111111111111111111111111
2222222222222222222222222222222222222
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaa
bbbbbbb
bbbbbbb
bbbbbbb
bbbbbbb
bbbbbbb
bbbbbb
Решение задачи: «Чтение файлов и вывод в stdout»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
//#include <string.h>
#define MAX 100
int main(int argc, char **argv)
{
char * string1 = (char*)malloc(MAX*sizeof(char));
char * string2 = (char*)malloc(MAX*sizeof(char));
char *str1;
char *str2;
int count1, count2;
FILE *fp, *fa;
if(argc < 2)
{
fprintf(stderr, "Вы не ввели имена файлов в качества аргументов\n");
}
if(argc < 3)
{
fprintf(stderr, "Вы не ввели имя второго файла в качества аргумена\n");
}
if ((fp = fopen(argv[1], "r")) == NULL || (fa = fopen(argv[2], "r")) == NULL)
{
fprintf(stderr, "Ошибка при открытии файлов\n");
exit(1);
}
while(1)
{
str1=fgets(string1, MAX, fp);
str2=fgets(string2, MAX, fa);
if((str1 == NULL) && (str2 != NULL))
{
fputs(string2, stdout);
}
else if((str1 != NULL) && (str2 == NULL))
{
fputs(string1, stdout);
}
else if((str1==NULL) && (str2==NULL)) break;
else
{
fputs(str1, stdout);
fputs(str2, stdout);
}
}
free(string1);
free(string2);
if(fclose(fp) != 0 || fclose(fa) != 0)
{
fprintf(stderr, "Ошибка при закрытии файла.\n");
}
return 0;
}
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы
- Определяется максимальное значение счетчика для циклов
- Выполняется проверка наличия имен файлов в качестве аргументов командной строки
- Выполняется проверка наличия второго имени файла в качестве аргумента командной строки
- Открываются файлы для чтения
- Устанавливаются начальные значения для строк и счетчиков
- В цикле while считываются строки из файлов
- Проверяется наличие строк после чтения
- Если строка 1 отсутствует и строка 2 присутствует, то выводится строка 2
- Если строка 1 присутствует и строка 2 отсутствует, то выводится строка 1
- Если обе строки отсутствуют, то цикл прерывается
- Выполняется освобождение памяти, выделенной под строки
- Проверяется корректность закрытия файлов
- Завершается выполнение программы