我正在使用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
答案 0 :(得分:2)
除了日期不一致的问题外,乔纳森(Jonathan)的评论还包含解决方案。但是,正确使用这些功能并非易事。这是在这种情况下如何使用strptime
和sscanf
的简短示例。
我在以下代码中做了一个简化,规定输入数据中的每一行都具有固定的最大长度。该假设可能是安全的,但是如果违反该假设,则代码将严重中断。不幸的是,处理可变的行长会使这种代码变得更加复杂。
#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。