繁体   English   中英

时间从文件转换并与当前时间进行比较

[英]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);
}
  1. 比较很好奇。 通常这种比较将采用这种形式

     if (h1 < h2 || (h1 == h2 && m1 < m2)) 
  2. difftime需要2个time_t参数,而不是char timeValue[50]struct tm

  3. 传递给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 tmscanf 此函数不初始化未指定的字段,以便您可以使用localtime分配当前时间,然后仅覆盖小时和分钟字段。

mktimestruct 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM