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