Скопировать из одного файла в другой все строки, не содержащие слова, начинающиеся на одну букву - C (СИ)
Формулировка задачи:
1) Скопировать из файла F1 в файл F2 все строки, которые не содержат слова, начинающиеся на одну букву.
2) Найти самое короткое слово в файле F2.(на языке Си)
Решение задачи: «Скопировать из одного файла в другой все строки, не содержащие слова, начинающиеся на одну букву»
textual
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <limits.h>
- int main()
- {
- FILE *fp = fopen("jrk.txt","r");
- FILE *fp1 = fopen("zrk.txt", "w");
- int i;
- char c;
- i = 0;
- int z = 0;
- int k = 0;
- char *v = (char *)malloc(200);
- char r = getchar();
- int flg = 0;
- int m = 0;
- int o;
- while((c = getc(fp)) != EOF) {//Копируем строки в другой файл с учетом условия задачи
- v[k] = c;
- if(isspace(v[k]) || ispunct(v[k]) || v[k] == '\n') {
- o = (m == 0) ? k-z : k-z+1;
- if(v[o] == r) {
- flg = 1;
- }
- z = 0;
- m++;
- }
- if(c == '\n') {
- v[k] = '\0';
- if(flg == 0) fprintf(fp1,"%s\n", v);
- flg = 0;
- m = 0;
- k = 0;
- z = 0;
- if(v[k] == EOF) break;
- continue;
- }
- k++;
- z++;
- }
- fclose(fp);
- fclose(fp1);
- z = 0;
- m = 0;
- o = 0;
- int min = INT_MAX;
- fp1 = fopen("zrk.txt", "r");
- while((c = getc(fp1)) != EOF) {//Ищем самое короткое слово
- *v = c;
- if(isspace(*v) || ispunct(*v) || *v == '\n' || *v == EOF) {
- if((m == 0) ? z: z-1 < min) {min = (m == 0) ? z : z-1;}
- m++;
- z = 0;
- o++;
- }
- if(*v == '\n') {
- z = 0;
- o = 0;
- }
- ++v;
- z++;
- }
- if(m > 0 ) printf("%d", min);
- else printf("ERROR");
- }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы с файлами и стандартными вводом-выводом
- Открываем файлы jrk.txt и zrk.txt для чтения и записи соответственно
- Инициализируем переменные i, c, k, z, m, v, r, flg, o, min и v как указатель на строку
- Считаем первый символ из файла jrk.txt и сохраняем его в переменной r
- Инициализируем счетчики z, m, o и k равными 0
- Пока не достигнем конца файла jrk.txt, считываем каждый символ и сохраняем его в массиве v
- Проверяем, является ли текущий символ пробелом, знаком препинания, началом новой строки или концом файла
- Если текущий символ является пробелом, знаком препинания или концом строки, то проверяем условие задачи: если следующий символ в строке совпадает с r, то устанавливаем флаг flg равным 1
- Если текущий символ является началом новой строки, то записываем строку из массива v в файл zrk.txt, если флаг flg равен 0
- Если текущий символ является началом новой строки и флаг flg равен 1, то записываем пустую строку в файл zrk.txt
- Если текущий символ является началом новой строки, то сбрасываем счетчики z, m, o и k равными 0
- Закрываем файлы jrk.txt и zrk.txt
- Открываем файл zrk.txt для чтения
- Пока не достигнем конца файла zrk.txt, считываем каждый символ и сохраняем его в массиве v
- Проверяем, является ли текущий символ пробелом, знаком препинания, началом новой строки или концом файла
- Если текущий символ является пробелом, знаком препинания или концом строки, то проверяем условие задачи: если предыдущий символ в строке является началом новой строки, то обновляем значение min, если длина строки меньше значения min
- Если текущий символ является началом новой строки, то сбрасываем счетчики z, m, o и k равными 0
- Если длина самой короткой строки в файле zrk.txt больше 0, то выводим ее значение, иначе выводим
ERROR
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д