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

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы для работы с файлами и стандартными вводом-выводом
  2. Открываем файлы jrk.txt и zrk.txt для чтения и записи соответственно
  3. Инициализируем переменные i, c, k, z, m, v, r, flg, o, min и v как указатель на строку
  4. Считаем первый символ из файла jrk.txt и сохраняем его в переменной r
  5. Инициализируем счетчики z, m, o и k равными 0
  6. Пока не достигнем конца файла jrk.txt, считываем каждый символ и сохраняем его в массиве v
  7. Проверяем, является ли текущий символ пробелом, знаком препинания, началом новой строки или концом файла
  8. Если текущий символ является пробелом, знаком препинания или концом строки, то проверяем условие задачи: если следующий символ в строке совпадает с r, то устанавливаем флаг flg равным 1
  9. Если текущий символ является началом новой строки, то записываем строку из массива v в файл zrk.txt, если флаг flg равен 0
  10. Если текущий символ является началом новой строки и флаг flg равен 1, то записываем пустую строку в файл zrk.txt
  11. Если текущий символ является началом новой строки, то сбрасываем счетчики z, m, o и k равными 0
  12. Закрываем файлы jrk.txt и zrk.txt
  13. Открываем файл zrk.txt для чтения
  14. Пока не достигнем конца файла zrk.txt, считываем каждый символ и сохраняем его в массиве v
  15. Проверяем, является ли текущий символ пробелом, знаком препинания, началом новой строки или концом файла
  16. Если текущий символ является пробелом, знаком препинания или концом строки, то проверяем условие задачи: если предыдущий символ в строке является началом новой строки, то обновляем значение min, если длина строки меньше значения min
  17. Если текущий символ является началом новой строки, то сбрасываем счетчики z, m, o и k равными 0
  18. Если длина самой короткой строки в файле zrk.txt больше 0, то выводим ее значение, иначе выводим ERROR

Оцени полезность:

11   голосов , оценка 4 из 5
Похожие ответы