如何使用C代码从文本文件中读取时间戳数据?

时间:2019-07-04 04:44:23

标签: c linux

我正在使用c代码在带有时间戳的文本文件中连续写入数据,如何从文本文件中读取一天/两天/一周/一年的数据?以下是示例文本文件数据。

20190629105716 value1:15 value2:25 value3:622
20190629105716 value1:15 value2:25 value3:622
20190630105716 value1:15 value2:25 value3:622
20190701105716 value1:15 value2:25 value3:622
20190702105716 value1:15 value2:25 value3:622
20190703105716 value1:15 value2:25 value3:622
20190704105716 value1:15 value2:25 value3:622
20190705105716 value1:15 value2:25 value3:622

1 个答案:

答案 0 :(得分:2)

除了日期不一致的问题外,乔纳森(Jonathan)的评论还包含解决方案。但是,正确使用这些功能并非易事。这是在这种情况下如何使用strptimesscanf的简短示例。

我在以下代码中做了一个简化,规定输入数据中的每一行都具有固定的最大长度。该假设可能是安全的,但是如果违反该假设,则代码将严重中断。不幸的是,处理可变的行长会使这种代码变得更加复杂。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX_LINE 1024

int main(void) {
    char line[MAX_LINE];

    while (fgets(line, MAX_LINE, stdin) != NULL) {
        struct tm tm;
        char *temp_ptr = strptime(line, "%a %b %d %H:%M:%S %Y", &tm);
        if (temp_ptr == NULL) {
            fprintf(stderr, "Error parsing date at \"%s\"\n", line);
            return EXIT_FAILURE;
        }

        int temp;
        if (sscanf(temp_ptr, " temp : %d", &temp) == 0) {
            fprintf(stderr, "Error parsing temperature at \"%s\"\n", temp_ptr);
            return EXIT_FAILURE;
        }

        // At this point we’ve successfully parsed the date and temperature.
        // Now we can use it. As a simple example, we just print it again:

        char time_str[20];
        strftime(time_str, sizeof time_str, "%Y-%m-%d %H:%M:%S", &tm);
        printf("Temperature %d on %s\n", temp, time_str);
    }

    if (! feof(stdin)) {
        fprintf(stderr, "Error reading input\n");
        return EXIT_FAILURE;
    }

    return EXIT_SUCCESS;
}

此代码从stdin读取数据。进行适当的更改。

此外,此代码使用当前语言环境来解析工作日和月份名称。通常,您将需要对此进行更多控制。更妙的是,通过更改数据格式,根本不必依赖“自然语言名称”作为日期。将日期存储为“ 7月4日星期三……”仅对人类读者有意义,对于机器阅读完全没有意义。存储机器可读日期的唯一可接受方式是ISO 8601(又名YYYY-MM-DD)或POSIX time