Чтение файлов и вывод в 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
- Если обе строки отсутствуют, то цикл прерывается
- Выполняется освобождение памяти, выделенной под строки
- Проверяется корректность закрытия файлов
- Завершается выполнение программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д