如何将时间戳的字符串转换为time_t?

时间:2013-01-31 23:56:54

标签: c timestamp

我有一个列出unix时间戳(文本文件)的文件,我想将它们转换为time_t并将其保存到另一个文件(二进制文件)中;

char timestamp[12];
timestamp[11] = '\0';

while (! feof(log)) {
    time_t t;
    /* 10 character for timestamp + 1 for newline */
    fread(timestamp, sizeof(char), 11, log);

    /* Black magic goes here */

    /*save time_t into new log */
    fwrite(&t,sizeof(time_t),1,newlog);

}

2 个答案:

答案 0 :(得分:1)

假设long足以容纳值:

char buffer[4096];

while (fgets(buffer, sizeof(buffer), log))
{
    long v;

    if (sscanf(buffer, "%ld", &v) != 1)
        ...process error...
    else
    {
        time_t t = v;
        if (fwrite(&t, sizeof(time_t), 1, newlog) != 1)
            ...report error...
    }
}

如果您担心long,请使用其他类型:long longintmax_t,并进行适当的更改(类型和scanf()格式)。如果您知道time_t的范围,则可以根据范围检查解析的值,但是没有标准的方法来确定time_t的范围(我知道没有标准的宏,因为例子)。

请注意,在输入函数报告“不再输入”之后,您应该使用feof()来区分EOF和错误,而不是尝试确定是否有更多输入。直到输入函数尝试读取并发现没有更多数据(例如,fgets()已返回NULL)之后,才知道没有任何其他输入。如果你在循环中使用feof()(如在你的代码中),你还必须检查输入函数,因为feof()可以说“不在EOF”,但下一个输入操作发现“不再数据 - 现在在EOF“。

答案 1 :(得分:0)

试试这个:

time_t read_time(FILE* fd) {
    time_t time = 0;
    int x;

    x = getc(fd);
    while ((x != EOF) && (isnum(x)))
    {
        time = (time * 10) + (x - '0');
        x = getc(fd);
    };

    return time;
}

这将读取时间戳(或任何数字序列,实际上)并将其转换为time_t,一次一个数字。直接使用time_t表示您不必担心输入是否会溢出longint