Подсчитать количество предложений в исходном файле и записать в файл-результат - C (СИ)
Формулировка задачи:
Пользователь задаёт при запуске файл с текстом и название файла, куда следует записать результат. Для данного файла подсчитать количество предложений и записать в файл с результатом строку в формате:
Название файла: количество предложений
Пример работы:
Имеем в директории файл win1.txt, в нём тест, в общем в нём 5 предложений.
И поехали:
./a.out win1.txt win2.txt
В директории создастся файл с именем "win2.txt" и в него запишется:
win1.txt : 5
Имеются ошибки, которые ломают мне голову, помогите исправить, пожалуйста.
Довольно интересное задание)
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> int sent_count(FILE * file); #define SIZE 256 int main(int argc, char* argv[]) { if (argc < 3) { printf("Ошибка ввода\n"); exit(EXIT_FAILURE); } char * result_filename = argv[argc - 1]; FILE *out = fopen(result_filename, "w"); if (out == NULL) { printf("Ошибка ввода\n"); perror(result_filename); } for (int i = 1; i < argc-1; i++) { FILE *in = fopen(argv[i], "r"); if (in == NULL) { printf("Ошибка ввода\n"); perror(argv[i]); } else { int count = sent_count(in); fprintf(out, "%s : %d\n", argv[i], count); } fclose(in); } fclose(out); return 0; } int sent_count(FILE * file) { char buffer[SIZE]; int count = 0; char sign; int size; while (feof(file) == 0){ size = fread(buffer, sizeof(char), SIZE, file); if (ferror(file)) { printf("Error Reading to myfile.txt\n"); exit(EXIT_FAILURE); } if (size == 0) { printf("Файл пустой!"); return 0; } else { for (int i = 0; i < size; i++) { if (ispunct(buffer[i])) { if (sign != '\0') { count++; sign = '\0'; } } else sign = buffer[i]; } } } return count; }
Решение задачи: «Подсчитать количество предложений в исходном файле и записать в файл-результат»
textual
Листинг программы
#include <stdio.h> #include <errno.h> #define is_space(c) ((c) == ' ' || (c) == '\t' || (c) == '\n') #define is_endp(c) ((c) == '.' || (c) == '!' || (c) == '?') //кол-во предложений в файле int count_ps(const char* _output, const char* _input){ int e; char s[256], *p; FILE* fp; unsigned n, i; if((fp = fopen(_input, "r")) == NULL) return errno; e = 0; n = i = 0; while(((p = fgets(s, 256, fp)) != NULL) && ((e = ferror(fp)) == 0)){ for(; *p; ++p){ if(is_endp(*p)){ if(i){ ++n; i = 0; } } else if(! is_space(*p)) i = 1; } } if((e = ferror(fp)) != 0){ fclose(fp); return e; } if((fp = freopen(_output, "w", fp)) == NULL) return errno; if(fprintf(fp, "%s : %u", _input, n + i) <= 0) e = ferror(fp); fclose(fp); return e; } int main(void){ char _input[] = "win1.txt"; char _output[] = "win2.txt"; int err = count_ps(_output, _input); if(err != 0) printf("error, code: %d\n", err); return 0; }
Объяснение кода листинга программы
- Подключение необходимых библиотек для работы с файлами и обработки ошибок.
- Определение двух вспомогательных функций: is_space(c) и is_endp(c). Первая проверяет является ли символ c пробелом, вторая - является ли символ c знаком пунктуации.
- Объявление функции count_ps, которая принимает два аргумента типа const char*: _output (имя выходного файла) и _input (имя входного файла).
- Внутри функции count_ps происходит открытие входного файла с помощью функции fopen. Если файл не удалось открыть, функция возвращает ошибку.
- Инициализация переменных e, n и i. e используется для хранения ошибки, n - для подсчета количества предложений, i - для учета предложения в текущей строке.
- Чтение из файла с помощью функции fgets. Если строка прочитана успешно, функция продолжает работу, иначе возвращает ошибку.
- Перебор символов в прочитанной строке. Если символ является знаком пунктуации, увеличивается счетчик n, если символ не пробел и не знак пунктуации - увеличивается счетчик i.
- После чтения всех строк из файла происходит закрытие файла и открытие выходного файла с помощью функции freopen.
- Запись в выходной файл имени входного файла и количества предложений с помощью функции fprintf.
- Закрытие выходного файла с помощью функции fclose.
- Возврат ошибки из функции count_ps.
- В функции main создаются две строки-имени файлов для входного и выходного файлов.
- Вызывается функция count_ps с аргументами _output и _input.
- Результат работы функции count_ps сохраняется в переменной err.
- Если err не равно нулю, выводится сообщение об ошибке с указанием кода ошибки.
- Завершение работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д