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