C89 - 从字符串中提取时间

C89 - Extract time from a string

我有一个问题,我需要从日志文件中读取行,检查该行是否包含单词 "fail",如果包含则输出从午夜到错误发生时经过了多少秒。

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

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

我正确地解决了问题的前两部分(从日志文件中读取行并检查它们是否包含单词 "fail")但是我对如何从日志文件并将其转换为自午夜以来经过的秒数。

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

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;

非常感谢

关于此发布的代码:

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()' 因为它只是 'true' 在尝试读取文件末尾之后,所以很少有用。

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

改用这个:

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' 给出的注释来提取时间字段

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

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

"official" 更安全的方法是使用 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)).