Подсчет количества слов в файле - C (СИ)
Формулировка задачи:
Доброго времени суток.
Подскажите, пожалуйста, в чем может быть проблема.
Программа должна работать с аргументом командой строки. И брать оттуда имя файла для открытия и последующей работы с ним, а именно - подсчет кол-ва слов в файле.
Вот код:
При запуске в терминале через ./05 work.txt выводит все содержимое входного файла и "ошибка сегментирования". Как быть?
/*
05 - имя самой программы
work.txt - входной файл
*/
#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); }
Решение задачи: «Подсчет количества слов в файле»
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; }
Объяснение кода листинга программы
- Подключение необходимых библиотек для работы с файлами и строками
- Проверка наличия имени файла в качестве аргумента командной строки
- Открытие файла с логами в режиме добавления
- Проверка успешного открытия файла с логами
- Запись метки времени в файл с логами
- Открытие входного файла
- Проверка успешного открытия входного файла
- Запись метки времени в файл с логами
- Чтение содержимого входного файла посимвольно с помощью функции fgetc
- Увеличение счетчика слов при достижении символа новой строки
- Запись символа в стандартный вывод
- Запись метки времени в файл с логами
- Запись количества слов в файл с логами
- Запись количества слов в стандартный вывод
- Закрытие входного файла
- Запись метки времени в файл с логами
- Запись сообщения о закрытии файла в файл с логами
- Закрытие файла с логами
- Возврат 0, что означает успешное выполнение программы
- Возврат 1 в случае возникновения ошибки
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д