0

我有一个列出 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);

}
4

2 回答 2

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”。

于 2013-02-01T00:04:46.870 回答
1

尝试这个:

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意味着您不必担心输入是否会溢出 alongint.

于 2013-02-01T00:58:12.837 回答