Нужно прожку написать, которая из лог файла выводила статистику сканирования портов по секундно, каждой минуты.
вот файл: http://pastebin.com/SGiBnszW
вот код: почему после вызова add происходит сегфолт?
// #3 log file
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>
struct scan // Информация о сканировании в течении одной минуты
{
char hr; // Час
char mn; // Минута
char qty[60];// Количество сканирований в каждую секунду
struct scan* next;
};
typedef struct scan Scan;
void foll(FILE* f, char lim)//Бежим по файлу до символа lim(пропуск)
{
if (getc(f) == lim)
return;
foll(f,lim);
}
char dtcd[8] = "Detected";
char prt[4] = "Port";
char scn[4] = "Scan";
char d[8];
char p[4];
char s[4];
char check()
{
char res = 1;
for(int i=4; i<8; i++)
res = res & (d[i] == dtcd[i]);
for(int i=0; i<4; i++)
{
res = res & (d[i] == dtcd[i]) & (p[i] == prt[i]) & (s[i] == scn[i]);
}
return res;
}
Scan* head;
void printLine(char q[])
{
printf("sec qty\n");
for(int i=0; i<60; i++)
{
if (q[i] != 0)
printf("%3d %3d\n",i,q[i]);
}
}
void add(int h, int m, int s)
{
char flag = 1;
if (head)
{
if ((head -> hr == h) & (head -> mn == m))
{
((head -> qty)[s]) += 1;
flag = 0;
}
}
if (flag)
{
Scan* tmp = calloc(1,sizeof(Scan));
tmp -> hr = h;
tmp -> mn = m;
tmp -> qty[s] = 1;
tmp -> next = head;
head = tmp;
}
printf("get One %d %d:\n",h,m);
printLine(head -> qty);
getchar();
}
void delList(Scan* s)
{
if (s == 0)
return;
delList(s -> next);
free(s);
}
void show()
{
printf("show one more or quit?(s,q): ");
if (getchar() == 'q')
return;
printf("input hour and minute to show(h m): ");
int h,m;
scanf("%d %d",&h,&m);
for(Scan* s=head; s!=0; s = s -> next)
{
if ((s -> hr == h) & (s -> mn == m))
{
printLine(s -> qty);
show();
return;
}
}
printf("there is not scans at this time\n");
show();
}
int main()
{
char path[50];
printf("input filename: ");
scanf("%s",path);
FILE* f = fopen(path,"rt");
if (f == 0) // Если файл не открылся
{
printf("can't open\n");
return 1;
}
fseek(f,0,SEEK_END);
long long endP = ftell(f);
fseek(f,0,SEEK_SET);
head = 0;
int th;
int tm;
int ts;
printf("scanning file...");
while (ftell(f) != endP)
{
foll(f,' ');
foll(f,' ');
foll(f,' ');
fscanf(f,"%d:%d:%d",&th,&tm,&ts);
foll(f,']');
foll(f,']');
fscanf(f,"%s %s %s",d,p,s);
if (check())
{
add(th,tm,ts);
}
foll(f,'\n');
}
printf(" Ok\n");
// show();
delList(head);
return 0;
}