Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将时间戳字符串转换为时间?_C_Timestamp - Fatal编程技术网

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

C 如何将时间戳字符串转换为时间?,c,timestamp,C,Timestamp,我有一个列出unix时间戳的文件(一个文本文件),我想将这些时间戳转换为时间戳并将其保存到另一个文件(一个二进制文件) 假设long足够大,可以容纳这些值: char buffer[4096]; while (fgets(buffer, sizeof(buffer), log)) { long v; if (sscanf(buffer, "%ld", &v) != 1) ...process error... else {

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


假设
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
intmax\t
,并进行适当的更改(类型和
scanf()
格式)。如果您知道
时间的范围
,则可以对照该范围检查解析的值,但没有确定
时间范围
的标准方法(例如,我不知道标准宏)

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

尝试以下操作:

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\u t
意味着您不必担心输入是否会溢出
long
int

您没有问任何问题,但是
feof
可能不像你想象的那样工作。@CarlNorum问题在标题上。这是一个类似的问题:
这应该会有帮助。@yasar11732:Carl说的是你没有按照你认为的方式使用
feof()
feof()
仅在您尝试读取超过文件结尾后返回非零。这不是读取4096缓冲区,但只处理其中的第一个时间戳,然后读取另一个4096字符吗?此外,POSIX允许
time\u t
为浮点类型,以防万一。@yasar11732:No;它读取最多4095个字符的行(并在末尾添加一个null),然后转换该行。输入包含这么长的行的可能性很小。如果您真的担心,请使用POSIX
getline()
,或者检查是否找到换行符并吞下该行的其余部分,或者…@dreamlax:是的。当你告诉我哪个系统实际上将
time\t
定义为浮点类型时,我打算开始担心这个问题(如果我认为我可能会将代码移植到这个特殊的系统中的话)。是C标准而不是POSIX标准提供了这一点。@JonathanLeffler:我也不担心,我只是觉得这是一个有趣的小道消息。
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;
}