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 longまたはintmax_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れ、一度に1桁ずつ変換されます。直接使用するということは、入力がオーバーフローするかtime_tどうかを心配する必要がないことを意味します。longint

于 2013-02-01T00:58:12.837 に答える