Написать программу по разбивке и анализу содержимого файла отчета работы ПО (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 - Переустанавливаем указатель чтения в начало файла
- Выводим сообщение об успешном выполнении программы