我有一个列出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);
}
答案 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 long
或intmax_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
表示您不必担心输入是否会溢出long
或int
。