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

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

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

Пользователь задаёт при запуске файл с текстом и название файла, куда следует записать результат. Для данного файла подсчитать количество предложений и записать в файл с результатом строку в формате: Название файла: количество предложений
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. int sent_count(FILE * file);
  6. #define SIZE 256
  7. int main(int argc, char* argv[]) {
  8. if (argc < 3) {
  9. printf("Ошибка ввода\n");
  10. exit(EXIT_FAILURE);
  11. }
  12. char * result_filename = argv[argc - 1];
  13. FILE *out = fopen(result_filename, "w");
  14. if (out == NULL)
  15. {
  16. printf("Ошибка ввода\n");
  17. perror(result_filename);
  18. }
  19. for (int i = 1; i < argc-1; i++) {
  20. FILE *in = fopen(argv[i], "r");
  21. if (in == NULL)
  22. {
  23. printf("Ошибка ввода\n");
  24. perror(argv[i]);
  25. } else {
  26. int count = sent_count(in);
  27. fprintf(out, "%s : %d\n", argv[i], count);
  28. }
  29. fclose(in);
  30. }
  31. fclose(out);
  32. return 0;
  33. }
  34. int sent_count(FILE * file) {
  35. char buffer[SIZE];
  36. int count = 0;
  37. char sign;
  38. int size;
  39. while (feof(file) == 0){
  40. size = fread(buffer, sizeof(char), SIZE, file);
  41. if (ferror(file)) {
  42. printf("Error Reading to myfile.txt\n");
  43. exit(EXIT_FAILURE);
  44. }
  45. if (size == 0) {
  46. printf("Файл пустой!");
  47. return 0;
  48. } else {
  49. for (int i = 0; i < size; i++) {
  50. if (ispunct(buffer[i]))
  51. {
  52. if (sign != '\0')
  53. {
  54. count++;
  55. sign = '\0';
  56. }
  57. }
  58. else sign = buffer[i];
  59. }
  60. }
  61. }
  62. return count;
  63. }
Пример работы: Имеем в директории файл win1.txt, в нём тест, в общем в нём 5 предложений. И поехали: ./a.out win1.txt win2.txt В директории создастся файл с именем "win2.txt" и в него запишется: win1.txt : 5 Имеются ошибки, которые ломают мне голову, помогите исправить, пожалуйста. Довольно интересное задание)

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <errno.h>
  3. #define is_space(c) ((c) == ' ' || (c) == '\t' || (c) == '\n')
  4. #define is_endp(c)  ((c) == '.' || (c) == '!'  || (c) == '?')
  5.  
  6. //кол-во предложений в файле
  7. int count_ps(const char* _output, const char* _input){
  8.     int      e;
  9.     char     s[256], *p;
  10.     FILE*    fp;
  11.     unsigned n, i;
  12.  
  13.     if((fp = fopen(_input, "r")) == NULL)
  14.         return errno;
  15.  
  16.     e = 0;
  17.     n = i = 0;
  18.     while(((p = fgets(s, 256, fp)) != NULL) && ((e = ferror(fp)) == 0)){
  19.         for(; *p; ++p){
  20.             if(is_endp(*p)){
  21.                 if(i){
  22.                     ++n;
  23.                     i = 0;
  24.                 }
  25.             } else if(! is_space(*p))
  26.                 i = 1;
  27.         }
  28.     }
  29.  
  30.     if((e = ferror(fp)) != 0){
  31.         fclose(fp);
  32.         return e;
  33.     }
  34.  
  35.     if((fp = freopen(_output, "w", fp)) == NULL)
  36.         return errno;
  37.  
  38.     if(fprintf(fp, "%s : %u", _input, n + i) <= 0)
  39.         e = ferror(fp);
  40.     fclose(fp);
  41.     return e;
  42. }
  43.  
  44. int main(void){
  45.     char _input[]  = "win1.txt";
  46.     char _output[] = "win2.txt";
  47.  
  48.     int err = count_ps(_output, _input);
  49.     if(err != 0)
  50.         printf("error, code: %d\n", err);
  51.     return 0;
  52. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы