У меня есть структура Log:
struct Log
{
char message[1024];
struct tm* time;
char proc_name[256];
char computer_name[256];
int proc_pid;
};
Я инициализирую ее:
char buf[1024];
struct Log* log = malloc(sizeof(struct Log));
log->time = malloc(sizeof(struct tm));
И я пытаюсь прочитать информацию из строки в структуру Log, используя эту функцию:
void SyslogParse(const char* src, struct Log* log)
{
strptime(src, "%b %d %T", log->time); //strptime WORK CORRECT!
int a = sscanf(src, "%s %d %d:%d:%d %s %s[%d]: %[^\n]s", NULL, NULL, NULL, NULL, NULL, &log->computer_name, &log->proc_name, &log->proc_pid, &log->message);
};
Или это:
void SyslogParse2(const char* src, struct Log* log)
{
strptime(src, "%b %d %T", log->time); //strptime WORK CORRECT!
int a = sscanf(src, "%s %d %d:%d:%d %s %s: %[^\n]s", NULL, NULL, NULL, NULL, NULL, log->computer_name, log->proc_name, log->message);
};
Строки, прочитанные из файла системного журнала. Например:
21 января 17:58:04 bogdasar-System-Product-Name-anacron [786]: задание `cron.daily 'прекращено
21 января 17:58:24 bogdasar-System-Product-Name 05efi: debug: / dev / sda2 - это раздел FAT32
Функции вызываются следующим образом:
SyslogParse2(buf, log);
Проблема : sscanf
в SyslogParse
функции не работают !!!
Полный код основного номера:
#define _XOPEN_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include "DateTime.h"
#include "Log.h"
#include "Keys.h"
#define SIZE 1024
int main(int argc, char* argv[])
{
FILE* fl;
char buf[1024];
//time_t d = time(NULL);
struct Keys keys;
struct tm* time = malloc(sizeof(struct tm));
struct Log* log = malloc(sizeof(struct Log));
log->time = malloc(sizeof(struct tm));
keys.time = malloc(sizeof(struct tm));
int opt;
char args[] = "hd:t:";
if(argc < 2)
{
fprintf(stderr, "Введите абсолютный путь к файлу\n");
return -1;
};
if((fl = fopen(argv[1], "r")) == NULL)
{
fprintf(stderr, "Не удаётся открыть файл. Возможно его не существует. Проверьте правильность пути.\n");
return -2;
};
while ((opt = getopt(argc, argv, args)) != -1)
{
switch (opt)
{
case 'h':
system("cat help.txt");
return 0;
case 'd':
keys.f_date = 1;
strptime(optarg, "%b/%d", keys.time);
break;
case 't':
keys.f_time = 1;
strptime(optarg, "%T", keys.time);
break;
default:
break;
}
};
while (fgets(buf, SIZE, fl))
{
SyslogParse2(buf, log);
};
return 0;
}
Log.h
#ifndef LOG
#define LOG
#define SIZE 1024
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
struct Log
{
char message[1024];
struct tm* time;
char proc_name[256];
char computer_name[256];
int proc_pid;
};
void SyslogParse(const char* src, struct Log* log);
void SyslogParse2(const char* src, struct Log* log);
#endif
Log. c
#include "Log.h"
#define _XOPEN_SOURCE
void SyslogParse(const char* src, struct Log* log)
{
strptime(src, "%b %d %T", log->time);
int a = sscanf(src, "%s %d %d:%d:%d %s %s[%d]: %[^\n]s", NULL, NULL, NULL, NULL, NULL, &log->computer_name, &log->proc_name, &log->proc_pid, &log->message);
};
void SyslogParse2(const char* src, struct Log* log)
{
strptime(src, "%b %d %T", log->time);
int a = sscanf(src, "%s %d %d:%d:%d %s %s: %[^\n]s", NULL, NULL, NULL, NULL, NULL, log->computer_name, log->proc_name, log->message);
};
A проблема : sscanf
в SyslogParse
функции не работают !!!