【问题标题】:C89 - Extract time from a stringC89 - 从字符串中提取时间
【发布时间】:2016-01-04 20:02:35
【问题描述】:

我有一个问题,我需要从日志文件中读取行,检查该行是否包含单词“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;

提前非常感谢

【问题讨论】:

标签: c string time format


【解决方案1】:

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

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;

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

【讨论】:

    【解决方案2】:

    关于这个发布的代码:

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

    【讨论】:

      猜你喜欢
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 2023-01-04
      • 2013-06-26
      • 1970-01-01
      • 1970-01-01
      • 2020-07-02
      • 1970-01-01
      相关资源
      最近更新 更多