之前我已经问了一些接近这个的东西,但是看起来,我从文件中获取的时间并没有转换为你从localtime()和time()获得的相同类型的时间。
正是我想要的是:
我有一个包含以下信息的txt文件
将Order.txt
FILE1.TXT; 5; 15:40
FILE2.TXT; 7; 15:41
FILE1.TXT; 10; 16:00
我的目标是在小时:分钟(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中的文字)
WAITS DIFF_TIME (正确完成)
显示来自 file1.txt
的内容WAITS 5 SECONDS
X - 显示来自 file2.txt 的内容(这是错误的,它应该再次检查,如果时间是15:02则会显示,不是15:01。我认为这是因为它仍然在时间值15:01读取而不是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
它打破了它。 知道如何正确地做到这一点吗?
答案 0 :(得分:2)
正如上面@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)
的值会向后显示。结果为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);
}
答案 1 :(得分:1)
Chux建议您使用自己的整数来表示午夜后的分钟,这在您的情况下可能更容易,但如果您想使用标准时间机制,则可以这样做。
但首先,请记住,有两个时间表示,time_t
,这是一个&#34;数字&#34;存储时间后的秒数和struct tm
的时间,这是人类可读的时间,将时间分解为数年,数月,数天等。
使用strptime
,您可以扫描符合格式规范的字符串。它是scanf
的{{1}}。此函数不会初始化未指定的字段,因此您可以使用localtime
指定当前时间,然后仅覆盖小时和分钟字段。
mktime
将struct tm
转换为struct tm
,您可以将其传递给difftime。
以下代码剪辑显示了这种比较可能如何起作用:
time_t