【问题标题】:Time doesn't update in C时间不会在 C 中更新
【发布时间】:2015-04-16 18:49:11
【问题描述】:

我遇到了一个非常奇怪的问题。我的时间根本没有改变,它总是在同一时间打印日志文件。这是一个覆盖上次的函数,应该返回新的:

char * update_time(char *date)
{
    time_t timer;
    timer = time(&timer);
    struct tm* time_real;
    time_real = localtime(&timer);
    date = asctime(time_real);
    strftime(date, 26, "%Y.%m.%d %H:%M:%S", time_real);
    return date;
}

这是我如何调用函数来获取新时间:

date = update_time(date);

在主函数中,我声明一个指向 char 的指针,如下所示:

char *date = NULL;

并在每次我需要获取新数据时调用该函数。更有趣的是,当我逐行调试程序时,我看到调试器“看到”了 char *data 的新值,但在结果文件中看不到(打印)。

这里是输出的txt文件:

2015.04.16 20:09:49:09S Program starts
2015.04.16 20:09:49:09S Opening file: a.txt
2015.04.16 20:09:49:09S New data retrieved
2015.04.16 20:09:49:09S Closing file: a.txt
2015.04.16 20:09:49:09S End of program

提前感谢您的帮助

编辑

用 Sleep(5000) 让我的程序小睡一会儿,@nos 和 @Weather Vane 是对的,这都是关于经过的时间(在我的问题的上下文中更有趣的是:D)。我们可以关闭这张票,谢谢大家的帮助。

【问题讨论】:

  • 这意味着您的程序在不到 1/100 秒内完成?您能否发布一个演示错误的最小可编译程序?
  • 您可能不应该覆盖您从asctime 返回的值。那条线看起来是多余的。
  • 为什么将日期作为指向函数的指针传递,并从函数返回指向日期的指针?这太令人困惑了。
  • 至少date = asctime(time_real); 是多余的,因为日期再次被strftime 覆盖。
  • 确实,尝试读取一个非常大的文件或循环遍历它。代码看起来不错。所以风向标的问题值得研究。

标签: c date time


【解决方案1】:

注意:asctime 在 MSVC 示例中被指出已弃用,因为它使用内部静态数组。

考虑改用asctime_s,它的输出采用缓冲区参数。

如果您使用asctime,您必须在再次使用之前复制其结果。除了立即使用之外,记住返回的指针是没有用的。

更新

我可以看到一个错误:

date = asctime(time_real);                          // overwrites the pointer you passed 
trftimse(date, 26, "%Y.%m.%d %H:%M:%S", time_real); // passes the pointer provided by asctime
return date;                                        // that's NOT the arg you passed

所以函数使用指向asctime返回的静态内部字符串的指针,而不是你提供的那个。

你的问题表明了这一点

char *date = NULL;
date = update_time(date);

因此,您将NULL 指针传递给strftime。它以前工作过,因为对 asctime 的无关调用将 NULL 指针替换为其内部静态指针。

但即使一切都正确,如果程序运行并在短时间内完成,time 的粒度意味着无法报告小的时间差异。

【讨论】:

  • "asctime 已弃用" -- 由谁弃用?
  • @KeithThompson by MSVC - 尽管这只是他们示例中的评论。 msdn.microsoft.com/en-us/library/kys1801b.aspx
  • asctime 函数由 ISO C 标准定义,ISO 并未弃用它。有充分的理由不使用它——它使用静态缓冲区和奇怪的输出格式。 asctime_s 的便携性较差;它直到 ISO C11 才被引入,作为新的可选边界检查接口的一部分。
  • @KeithThompson 是否同样适用于strtok 和其他人?
  • @KeithThompson “有充分的理由不使用它”所以大概它已被你弃用了。
猜你喜欢
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多