Написать программу по разбивке и анализу содержимого файла отчета работы ПО (log-файла) - C (СИ)
Формулировка задачи:
Здравствуйте, задача такова:
Написать программу по разбивке и анализу содержимого файла отчета работы ПО (log-файла).
Необходимо проанализаровать и подсчитать запросы, а также вывести их в алфавитном порядке с подсчетом колическтва повторений.
Программа должна выдавать отчет о своей работе в виде:
Дата Запросы
25.04.2002 - 12
26.04.2002 - 10
27.04.2002 - 5
...
Всего было сделано (запросов) - 1679
Сортировка запросов:
Бухгалтерский учет - 25
Бухгалтерский журнал - 30
Экономика Томска - 6
Экономика Якутии - 1
...
Пример файла отчета работы программы wslog.txt
Сортировку запросов необходимо проводить по CGI-переменным
S21STR=
S21ALL=
Вот код:
С первой частью, т.е. с подсчетом запросов по датам и общим числом запросов все норм. А вот во второй части, цикл while (str < (all_zapr -1)) почему-то бесконечный, не могу понять почему. Явно какая-то мелкая ошибка, помогите.
#include <stdio.h> #include <stdlib.h> #include <locale.h> #include <string.h> int main() { setlocale(LC_ALL, "Russian"); FILE *in, *in2, *out; int i=0, j, k, l=-1, m=0, length, str=0, zapr=1, all_zapr=0, temp=1; char stroka[700], data[11]={0,}, text[7000], zapros1[700], zapros2[700]; char sorting[2000][1000]; char *cgi_1, *cgi_2; in = fopen("wslog.txt", "r"); if(in == NULL) { printf("\nФайл для анализа не найден"); system("PAUSE>>void"); return 0; } out = fopen("results.txt", "w"); fprintf(out, " Дата Запросы\n"); fgets(stroka, 700, in); strncpy(data, stroka, 10); while(fgets(stroka, 700 , in) != '\0') { if(strncmp(data, stroka, 10) == 0) { zapr++; } else { fprintf(out, "%s - %d\n", data, zapr); zapr = 1; strncpy(data, stroka, 10); } all_zapr++; } fprintf(out, "%s - %d\n", data, zapr); all_zapr++; fprintf(out, "\n\nВсего запросов - %d", all_zapr); fclose(in); in2 = fopen("wslog.txt", "r"); fprintf(out, "\n\n\nОтсортированные запросы:\n\n"); while (str < (all_zapr - 1)) { l = -1; do { l++; text[l] = fgetc(in2); if(text[l] == '\n') str++; } while(text[l] != '&'); cgi_1 = strstr(text, "S21STR="); cgi_2 = strstr(text, "S21ALL="); if(cgi_1 != '\0') { i++; cgi_1 += 7; length = strcspn(cgi_1, "&\n"); for(j=0; j<length; j++) { sorting[i][j] = *cgi_1; cgi_1++; } } if(cgi_2 != '\0') { i++; cgi_2 += 7; length = strcspn(cgi_2, "&\n"); for(j=0; j<length; j++) { sorting[i][j] = *cgi_2; cgi_2++; } } } l=0; for(k=0; k<=(i-1); k++) { for(l=(k+1); l<(i+1); l++) { if( (strcmp(sorting[k], sorting[l])) > 0) { strcpy(zapros1, sorting[k]); strcpy(sorting[k], sorting[l]); strcpy(sorting[l], zapros1); } } } strcpy(zapros1, sorting[0]); for(m=1; m<(i+1); m++) { strcpy(zapros2, sorting[m]); if(strcmp(zapros1, zapros2) == 0) { temp++; strcpy(zapros1, zapros2); } else { fprintf(out, "%s - %d\n", zapros1, temp); temp = 1; strcpy(zapros1, zapros2); } } fprintf(out, "%s - %d\n", zapros1, temp); fclose(in2); fclose(out); printf("\nРезультаты анализа отображены в файле results.txt..."); printf("\nНажмите любую клавишу для завершения программы..."); system("PAUSE>>void"); return 0; }
Решение задачи: «Написать программу по разбивке и анализу содержимого файла отчета работы ПО (log-файла)»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <locale.h> #include <string.h> int main() { setlocale(LC_ALL, "Russian"); FILE *in, *matr, *out; int i=-1, j, k, l, m=0, length=0, str=0, zapr=1, all_zapr=0, temp=1, q; char stroka[700], data[11]={0,}, text[700]={0}, zapros1[100]={0}, zapros2[100]={0}; char sorting[2000][100]; char *cgi[2]; in = fopen("wslog.txt", "r"); matr = fopen("temp.txt", "w"); if(in == NULL) { printf("\nГ”Г*éë äëÿ Г*Г*Г*ëèçГ* Г*ГҐ Г*Г*éäåГ*"); system("PAUSE>>void"); return 0; } out = fopen("results.txt", "w"); fprintf(out, " Г„Г*ГІГ* Г‡Г*ïðîñû\n"); fgets(stroka, 700, in); strncpy(data, stroka, 10); while(fgets(stroka, 700 , in) != '\0') { if(strncmp(data, stroka, 10) == 0) { zapr++; } else { fprintf(out, "%s - %d\n", data, zapr); zapr = 1; strncpy(data, stroka, 10); } all_zapr++; } fprintf(out, "%s - %d\n", data, zapr); all_zapr++; fprintf(out, "\n\nÂñåãî Г§Г*ïðîñîâ - %d", all_zapr); fseek(in, 0, SEEK_SET); fprintf(out, "\n\n\nÎòñîðòèðîâГ*Г*Г*ûå Г§Г*ïðîñû:\n\n"); i = -1; /* ГЋГ
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы
- Устанавливаем русскую локаль
- Открываем файл
wslog.txt
для чтения - Открываем файл
temp.txt
для записи - Проверяем, удалось ли открыть файл
wslog.txt
- Открываем файл
results.txt
для записи - Выводим заголовок на экран и в файл
results.txt
- Считываем строку из файла
wslog.txt
- Копируем первые 10 символов строки в переменную
data
- Начинаем цикл, который будет выполняться до тех пор, пока не достигнем конца файла
- Внутри цикла проверяем, совпадает ли текущая строка с предыдущей
- Если да, то увеличиваем счетчик
zapr
на единицу - Если нет, то выводим значение счетчика
zapr
и сбрасываем его в начало цикла - Обновляем значение переменной
data
- Увеличиваем счетчик
all_zapr
на единицу - После окончания цикла выводим значение счетчика
zapr
иall_zapr
- Возвращаемся к началу файла
- Выводим заголовок на экран и в файл
results.txt
- Переустанавливаем указатель чтения в начало файла
- Выводим сообщение об успешном выполнении программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д