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