C 如何将时间戳字符串转换为时间?
我有一个列出unix时间戳的文件(一个文本文件),我想将这些时间戳转换为时间戳并将其保存到另一个文件(一个二进制文件)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 {
假设
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),然后转换该行。输入包含这么长的行的可能性很小。如果您真的担心,请使用POSIXgetline()
,或者检查是否找到换行符并吞下该行的其余部分,或者…@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;
}