Подсчитать количество предложений в исходном файле и записать в файл-результат - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Пользователь задаёт при запуске файл с текстом и название файла, куда следует записать результат. Для данного файла подсчитать количество предложений и записать в файл с результатом строку в формате: Название файла: количество предложений
#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;
}
Пример работы: Имеем в директории файл win1.txt, в нём тест, в общем в нём 5 предложений. И поехали: ./a.out win1.txt win2.txt В директории создастся файл с именем "win2.txt" и в него запишется: win1.txt : 5 Имеются ошибки, которые ломают мне голову, помогите исправить, пожалуйста. Довольно интересное задание)

Решение задачи: «Подсчитать количество предложений в исходном файле и записать в файл-результат»

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;
}

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

  1. Подключение необходимых библиотек для работы с файлами и обработки ошибок.
  2. Определение двух вспомогательных функций: is_space(c) и is_endp(c). Первая проверяет является ли символ c пробелом, вторая - является ли символ c знаком пунктуации.
  3. Объявление функции count_ps, которая принимает два аргумента типа const char*: _output (имя выходного файла) и _input (имя входного файла).
  4. Внутри функции count_ps происходит открытие входного файла с помощью функции fopen. Если файл не удалось открыть, функция возвращает ошибку.
  5. Инициализация переменных e, n и i. e используется для хранения ошибки, n - для подсчета количества предложений, i - для учета предложения в текущей строке.
  6. Чтение из файла с помощью функции fgets. Если строка прочитана успешно, функция продолжает работу, иначе возвращает ошибку.
  7. Перебор символов в прочитанной строке. Если символ является знаком пунктуации, увеличивается счетчик n, если символ не пробел и не знак пунктуации - увеличивается счетчик i.
  8. После чтения всех строк из файла происходит закрытие файла и открытие выходного файла с помощью функции freopen.
  9. Запись в выходной файл имени входного файла и количества предложений с помощью функции fprintf.
  10. Закрытие выходного файла с помощью функции fclose.
  11. Возврат ошибки из функции count_ps.
  12. В функции main создаются две строки-имени файлов для входного и выходного файлов.
  13. Вызывается функция count_ps с аргументами _output и _input.
  14. Результат работы функции count_ps сохраняется в переменной err.
  15. Если err не равно нулю, выводится сообщение об ошибке с указанием кода ошибки.
  16. Завершение работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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