Написать программу по разбивке и анализу содержимого файла отчета работы ПО (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= Вот код:
#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;
}
С первой частью, т.е. с подсчетом запросов по датам и общим числом запросов все норм. А вот во второй части, цикл while (str < (all_zapr -1)) почему-то бесконечный, не могу понять почему. Явно какая-то мелкая ошибка, помогите.

Решение задачи: «Написать программу по разбивке и анализу содержимого файла отчета работы ПО (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;
 
/* ГЋГ

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

  1. Включаем необходимые заголовочные файлы
  2. Устанавливаем русскую локаль
  3. Открываем файл wslog.txt для чтения
  4. Открываем файл temp.txt для записи
  5. Проверяем, удалось ли открыть файл wslog.txt
  6. Открываем файл results.txt для записи
  7. Выводим заголовок на экран и в файл results.txt
  8. Считываем строку из файла wslog.txt
  9. Копируем первые 10 символов строки в переменную data
  10. Начинаем цикл, который будет выполняться до тех пор, пока не достигнем конца файла
  11. Внутри цикла проверяем, совпадает ли текущая строка с предыдущей
  12. Если да, то увеличиваем счетчик zapr на единицу
  13. Если нет, то выводим значение счетчика zapr и сбрасываем его в начало цикла
  14. Обновляем значение переменной data
  15. Увеличиваем счетчик all_zapr на единицу
  16. После окончания цикла выводим значение счетчика zapr и all_zapr
  17. Возвращаемся к началу файла
  18. Выводим заголовок на экран и в файл results.txt
  19. Переустанавливаем указатель чтения в начало файла
  20. Выводим сообщение об успешном выполнении программы

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


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

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

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