C89 - 从字符串中提取时间

时间:2015-10-07 14:20:23

标签: c string time format

我有一个问题,我需要从日志文件中读取行,检查该行是否包含单词" fail"如果是这样,则输出从午夜到错误发生的时间。>

日志文件中的示例行如下所示:

Aug 20 10:20:57 kernel: ata3: SATA link down

我正确地解决了问题工作的前两部分(从日志文件中读取行并检查它们是否包含单词"失败")但我对如何提取时间感到困惑从日志文件中将其转换为从午夜开始经过的秒数。

到目前为止我看到的是这个(代码的相关部分):

do
{
    currLine = fgets(buff, sizeof(buff), inFile);

    if(strstr(currLine, "fail") != NULL)
    {
        /*convert the time into seconds since midnight and output it*/
    }
} while(!feof(inFile));

到目前为止,我只能提出一个如何实现它的想法,但它不起作用(这将在上面的if语句中,我已经放置了占位符注释解释它是什么需要做的事情:

int hr, min, sec, timePassed;           
fscanf(currLine, "%d:%d:%d", &hr, &min, &sec);
timePassed = hr * 3600 + min * 60 + sec;

非常感谢

2 个答案:

答案 0 :(得分:0)

关于这个发布的代码:

do
{
    currLine = fgets(buff, sizeof(buff), inFile);

    if(strstr(currLine, "fail") != NULL)
    {
        /*convert the time into seconds since midnight and output it*/
    }
} while(!feof(inFile));

不要使用' feof()'因为它只是'真实'在尝试读取文件末尾之后,很少,如果有用的话。

如果日志文件为空,则不希望处理日志文件行。

改为使用:

while( currLine = fgets(buff, sizeof(buff), inFile) )
{

    if(strstr(currLine, "fail") != NULL)
    {
        /*convert the time into seconds since midnight and output it*/
    }
}

因为它不会尝试处理空行,(日志文件为空或试图读取文件末尾)

除非指针:currLine在其他地方使用,所有引用都可以消除,并且在调用strstr()时,请使用:' buff'

从行中提取时间,首先需要跨越前两个字段。有几种可能的方法可以做到这一点。

您可以使用' chux'提取时间字段

答案 1 :(得分:0)

您的示例因两个原因无效。首先,您正在使用fscanf 而不是sscanf(文件和字符串)和第二:你没有跳转到 数字。您的扫描从字符串的开头开始 没有数字,所以它不匹配。一个简单的黑客来使这项工作,如果 月份和日期部分的大小常量,类似于:

sscanf(currLine+7, "%d:%d:%d", &hr, &min, &sec);

“官方”和更安全的方法是使用strptime,如果你的话 实施使其可用。

#include <time.h>

struct tm time;

/* ... */

strptime(currLine, "%b %d %H:%M:%S", &time);

现在您拥有time结构,可以提取所需的组件。

timePassed = time.tm_hour * 3600 + time.tm_min * 60 + time.tm_sec;

警告:如评论中所述,请检查您的使用情况 while(!feof(inFile))