Подсчет количества слов в файле - 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 в случае возникновения ошибки