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