Подсчет количества слов в файле - C (СИ)

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

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

Доброго времени суток. Подскажите, пожалуйста, в чем может быть проблема. Программа должна работать с аргументом командой строки. И брать оттуда имя файла для открытия и последующей работы с ним, а именно - подсчет кол-ва слов в файле. Вот код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
 
int main (int argc, char* argv[])
{
  char ch;
  int CountW=0;
  FILE *fin, *flog;
  
  if (argc<2)
  {
    puts(" ___________________________________ ");  
    puts("|                   ОШИБКА!                        |"); 
    puts("|--------------------------------------- |");
    puts("| Используйте ./05 filename                   |");
    puts("| где filename - имя входного файла.      |");
    puts("|___________________________________|");
  }
  if ((flog=fopen("05.log","a"))==NULL)
  {
    puts("Ошибка открытия протокола");
    timestamp(flog);
    fprintf(flog,"Ошибка открытия протокола\n ");
    fclose(flog);
  }
  fprintf(flog,"\n------------------------\n");
  timestamp(flog);
  fprintf(flog,"Начало работы\n");
  if ((fin=fopen(argv[1],"r"))==NULL)
  {
    puts("Ошибка открытия входного файла");
    timestamp(flog);
    fprintf(flog,"Ошибка открытия входного файла\n");
    fprintf(flog,"Конец работы\n");
    fclose(flog);
  }
  timestamp(flog);
  fprintf(flog,"Открыт файл %s\n",argv[1]);
  while(!feof(fin))
  {
    ch=fgetc(fin);
    if(ch=='\n') CountW++;
    putchar(ch);    
  }
  timestamp(flog);
  fprintf(flog,"В файле %s содержится %n строк\n", argv[1],CountW);
  printf("В файле %s содержится %n строк\n", argv[1],CountW);
  fclose(fin);
  timestamp(flog);
  fprintf(flog,"Файл %s закрыт\n",argv[1]);
  fprintf(flog,"Конец работы\n");
  fclose(flog);
}
При запуске в терминале через ./05 work.txt выводит все содержимое входного файла и "ошибка сегментирования". Как быть? /* 05 - имя самой программы work.txt - входной файл */

Решение задачи: «Подсчет количества слов в файле»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>)
 
int main(int argc, char* argv[]) {
    char ch;
    int CountW = 0;
    FILE* fin, *flog;
 
    if (argc < 2) {
        puts(" <br>");
        puts("|                   ОШИБКА!              |");
        puts("|--------------------------------------- |");
        puts("| Используйте ./05 filename              |");
        puts("| где filename - имя входного файла.     |");
        puts("|<br>|");
        return 1;
    }
 
    if ((flog = fopen("05.log", "a")) == NULL) {
        fprintf(stderr, "Ошибка открытия протокола\n ");
        return 1;
    }
    fprintf(flog, "\n------------------------\n");
    timestamp(flog);
    fprintf(flog, "Начало работы\n");
    if ((fin = fopen(argv[1], "r")) == NULL) {
        puts("Ошибка открытия входного файла");
        timestamp(flog);
        fprintf(flog, "Ошибка открытия входного файла\n");
        fprintf(flog, "Конец работы\n");
        fclose(flog);
        return 1;
    }
    timestamp(flog);
    fprintf(flog, "Открыт файл %s\n", argv[1]);
    while (!feof(fin)) {
        ch = fgetc(fin);
        if (ch == '\n') {
            CountW++;
        }
        putchar(ch);
    }
    timestamp(flog);
    fprintf(flog, "В файле %s содержится %d строк\n", argv[1], CountW);
    printf("В файле %s содержится %d строк\n", argv[1], CountW);
    fclose(fin);
    timestamp(flog);
    fprintf(flog, "Файл %s закрыт\n", argv[1]);
    fprintf(flog, "Конец работы\n");
    fclose(flog);
 
    return 0;
}

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

  1. Подключение необходимых библиотек для работы с файлами и строками
  2. Проверка наличия имени файла в качестве аргумента командной строки
  3. Открытие файла с логами в режиме добавления
  4. Проверка успешного открытия файла с логами
  5. Запись метки времени в файл с логами
  6. Открытие входного файла
  7. Проверка успешного открытия входного файла
  8. Запись метки времени в файл с логами
  9. Чтение содержимого входного файла посимвольно с помощью функции fgetc
  10. Увеличение счетчика слов при достижении символа новой строки
  11. Запись символа в стандартный вывод
  12. Запись метки времени в файл с логами
  13. Запись количества слов в файл с логами
  14. Запись количества слов в стандартный вывод
  15. Закрытие входного файла
  16. Запись метки времени в файл с логами
  17. Запись сообщения о закрытии файла в файл с логами
  18. Закрытие файла с логами
  19. Возврат 0, что означает успешное выполнение программы
  20. Возврат 1 в случае возникновения ошибки

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


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

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

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