我遇到一个问题,我需要从日志文件中读取行,检查该行是否包含单词“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;
提前非常感谢
最佳答案
您的示例因两个原因而不起作用。首先,您使用的是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))
.
关于C89 - 从字符串中提取时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32994774/