[英]Time convert from a file and compare to the current time
我之前已经问了一些接近这个的东西,但是看起来,我从文件中获取的时间并没有转换为你从localtime()和time()获得的相同类型的时间。
我想要的是:
我有一个包含以下信息的txt文件
将Order.txt
FILE1.TXT; 5; 15:40
FILE2.TXT; 7; 15:41
FILE1.TXT; 10; 16:00
我的目标是以小时:min (15:40)获得时间,然后,如果它与currentTime相同,那么我将显示file1.txt内容。 否则,如果currentTime低于小时:最小时间(15:40),它等待直到15:40,并显示file1.txt内容。 如果currentTime更高,则忽略第一个并转到下一个。
因此,例如,如果当前时间是15:39 ,它将等待1分钟 ,然后显示file1.txt内容。 如果当前时间是15:40 ,则显示file1.txt内容而不等待。 如果当前时间是15:41 ,它只是转到下一个( file2.txt )并再次检查。
使用的变量
FILE* orderFile;
FILE* contentFile;
FILE* defaultFile; (This will be used when this code works)
char fileName[50];
char textContent[5000];
int seconds;
int hour, min;
int diff_time;
char timeValue[50];
time_t current;
包括
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
所以为此,我尝试了以下代码:
orderFile = fopen("order.txt","r");
defaultFile = fopen("default.txt","r");
while(fscanf(orderFile," %49[^;];%d; %49[^\n]",fileName,&seconds,timeValue)
{
sscanf(timeValue,"%d:%d",&hour,&min);
contentFile = fopen(fileName,"r");
if(contentFile != NULL)
{
fseek (contentFile, 0, SEEK_END);
size = ftell(contentFile);
rewind(contentFile);
if(size == 0)
{
printf("\nEmpty file. (Scanned file: %s)\n", fileName);
fclose(contentFile);
}
else
{
time_t now;
time(&now);
struct tm file_time_tm;
file_time_tm = *localtime(&now);
file_time_tm.tm_hour = hour;
file_time_tm.tm_min = min;
file_time_tm.tm_sec = 0;
file_time_tm.tm_isdst = -1;
time_t fileTime = mktime(&file_time_tm);
double diff_time = difftime(fileTime, now);
if(diff_time == 0)
{
while(fscanf(contentFile,"%[^\t]",textContent) == 1)
{
printf("%s\n", textContent);
}
sleep(seconds);
}
else
{
if(diff_time > 0)
{
while(fscanf(defaultFile,"%[^\t]",defaultContent) == 1)
{
printf("%s\n", defaultContent);
}
sleep(diff_time);
while(fscanf(contentFile,"%[^\t]",textContent) == 1)
{
printf("%s\n", textContent);
}
sleep(seconds);
}
}
fclose(defaultFile);
fclose(contentFile);
}
}
else
{
if(contentFile == NULL)
{
printf("\nFile does not exist. (Scanned file: %s)\n", fileName);
fclose(contentFile);
}
}
}
fclose(orderFile);
printf("\n");
所以多亏了chux,它现在已经很好用,但还没有完全正常工作。
如果我有以下内容:
当前时间: 15 : 00
将Order.txt
FILE1.TXT; 5; 15:01
FILE2.TXT; 6; 15:02
file3.txt; 3; 15:03
当我运行该程序时,将发生以下情况:
默认消息(default.txt中的文本)
等待DIFF_TIME (正确完成)
显示来自file1.txt的内容
等待5秒
X - 显示来自file2.txt的内容 (这是错误的,它应该再次检查,如果时间是15:02它将显示,而不是15:01。我认为这是因为它仍在15:01读取timeValue而不是15:02,任何想法为什么?)
等待直到它15:02 (错误)
显示file3.txt(错误)
等到15:03
ENDS (错误,因为它不应该在等待后结束,它应该在file3.txt显示并等待3秒时结束)
我需要的输出:
默认消息
等待diff_time
file1.txt内容
等了5秒
默认消息
等待diff_time
file2.txt内容
等了7秒
默认消息
等待diff_time
file3.txt内容
等了3秒
ENDS
如果我有两个同时具有的文件,它也不能正常工作,例如:
将Order.txt
FILE1.TXT; 5; 15:01
FILE2.TXT; 6; 15:01
file3.txt; 3; 15:02
它打破了它。 知道如何正确地做到这一点?
正如上面@M Oehm评论的那样,显然编译器警告未完全启用。 建议启用它们 - 它将节省您的时间。
问题在于时间比较和减法。
// Troublesome code
if(currentTime->tm_hour < hour && currentTime->tm_min < min) {
diff_time = difftime(currentTime,timeValue);
printf("%d - Or this?\n", diff_time);
sleep(diff_time);
}
比较很好奇。 通常这种比较将采用这种形式
if (h1 < h2 || (h1 == h2 && m1 < m2))
difftime
需要2个time_t
参数,而不是char timeValue[50]
和struct tm
。
传递给double difftime(time_t time1, time_t time0)
的值double difftime(time_t time1, time_t time0)
向后显示。 结果是time1 - time0
。
建议改为
int current_hm = currentTime->tm_hour * 60 + currentTime->tm_min;
int file_hm = hour * 60 + min;
if (current_hm < file_hm) {
unsigned diff_time = (file_hm - current_hm)*60u;
printf("%u - Or this?\n", diff_time);
sleep(diff_time);
}
[编辑]简化方法。
time_t now;
time(&now);
struct tm file_time_tm;
file_time_tm = *localtime(&now);
file_time_tm.tm_hour = hour; // from file
file_time_tm.tm_min = min; // from file
file_time_tm.tm_sec = 0;
file_time_tm.tm_isdst = -1;
time_t filetime = mktime(&file_time_tm);
double diff = difftime(filetime, now); // filetime - now
if (diff > 0) {
sleep((unsigned) diff);
}
Chux的建议是用您自己的整数来表示午夜后的分钟,在您的情况下可能更容易,但如果您想使用标准时间机制,则可以这样做。
但首先要记住,有两个时间表示, time_t
,这是一个“数字”时间,用于存储纪元和struct tm
之后的秒数,这是人类可读的时间,将时间缩短到数年,数月,等等。
使用strptime
,您可以扫描符合格式规范的字符串。 它是struct tm
的scanf
。 此函数不初始化未指定的字段,以便您可以使用localtime
分配当前时间,然后仅覆盖小时和分钟字段。
mktime
将struct tm
转换为time_t
,您可以将其传递给difftime。
以下代码剪切显示了这样的比较可能如何工作:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main()
{
char stamp[] = "12:53";
char *p;
struct tm now;
time_t t = time(NULL);
now = *localtime(&t);
p = strptime(stamp, "%H:%M", &now);
if (p == NULL || *p != '\0') {
printf("Illegal date.\n");
} else {
char buf[20];
double dsec;
int dmin;
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M\n", &now);
puts(buf);
dsec = difftime(t, mktime(&now));
printf("Diff: %g sec\n", dsec);
dmin = (int) dsec / 60;
printf("Diff: %d min\n", dmin);
}
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.