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

时间:2015-01-03 15:47:46

标签: c file time

之前我已经问了一些接近这个的东西,但是看起来,我从文件中获取的时间并没有转换为你从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

它打破了它。 知道如何正确地做到这一点吗?

2 个答案:

答案 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);
}
  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)的值会向后显示。结果为time1 - time0

  4. 推荐

        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指定当前时间,然后仅覆盖小时和分钟字段。

mktimestruct tm转换为struct tm,您可以将其传递给difftime。

以下代码剪辑显示了这种比较可能如何起作用:

time_t