Написать программу анализирующую лог файл сервера apache - C (СИ) (156762)
Формулировка задачи:
Написать программу анализирующую лог файл сервера apache, рассчитывающую увеличение нагрузки на
сервере по часам суток. В результате нужно вывести на экран значения массива из 24 элементов, в каждом
элементе которого записано значение соответствующее определенному часу.
Решение задачи: «Написать программу анализирующую лог файл сервера apache»
textual
Листинг программы
#include <string.h> typedef struct Httpd_ts { struct tm time; char date[256]; char content[256]; } HTTPD_TS; HTTPD_TS& ParseTime(char* psz); bool IsEqualTime(HTTPD_TS& _ts1, HTTPD_TS& _ts2); int main() { FILE* fp = NULL; char* filename = "access.log"; if ((fp = fopen(filename,"r")) == NULL) printf("Unable to open file %s\n",filename); static char line[256] = "\0"; while (fgets(line, 256, fp) != NULL) { int count = 1; HTTPD_TS ts = ParseTime(line); printf("%s\t",ts.content); while ((fgets(line, 256, fp) != NULL) && IsEqualTime(ParseTime(line),ts)) count++; printf("count = %d\n",count+1); } fclose(fp); return 0; } bool IsEqualTime(HTTPD_TS& _ts1, HTTPD_TS& _ts2) { return (_ts1.time.tm_hour == _ts2.time.tm_hour) && (strcmp(_ts1.date, _ts2.date) == 0); } HTTPD_TS& ParseTime(char* psz) { struct tm time; HTTPD_TS httpd_ts; char* pch = NULL; if ((pch = strchr(psz,'[')) != NULL) { int i = 0; char* pchtm = NULL; while ((*pch++ != ']') && (*pch != '\0')) httpd_ts.content[i++] = *pch; httpd_ts.content[i-1] = '\0'; if ((pchtm = strchr(httpd_ts.content,':')) != NULL) { int k = 0; int i = 0; char psztime[256] = "\0"; while(httpd_ts.content[i] != *pchtm) httpd_ts.date[i] = httpd_ts.content[i++]; httpd_ts.date[i] = '\0'; while (*pchtm++ != ' ') psztime[k++] = *pchtm; sscanf(psztime,"%d:%d:%d",&time.tm_hour, &time.tm_min,&time.tm_sec); httpd_ts.time = time; } } return httpd_ts; }
Объяснение кода листинга программы
- Структура HTTPD_TS содержит поля time и date, а также массив char content размером 256 байт.
- Функция ParseTime принимает строку и возвращает объект HTTPD_TS, заполненный данными из этой строки.
- В функции ParseTime сначала ищется подстрока '[' и, если найдена, из нее извлекается подстрока, следующая за ней, до первого вхождения ']'. Эта подстрока сохраняется в поле content объекта HTTPD_TS.
- Затем ищется подстрока ':', и если найдена, из нее извлекается подстрока, следующая за ней, до первого вхождения пробела. Эта подстрока сохраняется в поле date объекта HTTPD_TS.
- С помощью функции sscanf извлекаются значения часов, минут и секунд из подстроки psztime и заполняются поля tm_hour, tm_min и tm_sec объекта time структуры tm.
- В поле time объекта HTTPD_TS записывается объект time.
- Функция main открывает файл access.log для чтения и считывает его построчно.
- Для каждой строки, считанной из файла, вызывается функция ParseTime, чтобы заполнить объект HTTPD_TS.
- Затем выводится значение поля content объекта HTTPD_TS.
- Далее, пока не встретится строка, в которой поле date совпадает с полем date текущего объекта HTTPD_TS (с учетом того, что строки разделяются считыванием), вызывается функция IsEqualTime, и если она возвращает true, выводится значение поля content объекта HTTPD_TS.
- Функция IsEqualTime сравнивает значения полей tm_hour и сравнивает строки, используя функцию strcmp.
- Значения поля content объектов HTTPD_TS не сравниваются.
- В конце программы файл закрывается.
- Если при открытии файла возникает ошибка, выводится сообщение об ошибке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д