почему это не удалось?
OP позже добавил код и сообщил "error of ... fscanf" .
С включенными предупреждениями мой компилятор также предупреждал.
предупреждение: формат "% d" ожидает аргумент типа "int *", но аргумент 4 имеет тип "long int *"
Читать time_t
из текстового файла сложно. Атрибуты диапазона, эпохи, типа данных - все в игре. Кроме того, как текстовые данные в файле, атрибуты могут отличаться от системы, в которой они были записаны. Обратите внимание, что для time_t
.
нет спецификатора
fscanf()
.
Пока давайте предположим, что текстовая метка времени является просто числовой и соответствует целому числу time_t
, хотя мы не знаем специфику целочисленного типа. Более продвинутые методы не требуют этих допущений.
Считайте отметку времени, используя самый широкий доступный тип со знаком, например intmax_t
(или long
в системах до C99). Некоторая проверка диапазона стоит усилий. Я также рекомендовал бы писать time_t
, используя тот же широкий тип.
Примечание: лучше сравнить fscanf()
возвращаемое значение с одним ожидаемым значением (3), а не только с одним из различных неожиданных значений (EOF, 0, 1, 2). Используйте ограничения ширины для ввода строки.
char filename[64] = {0};
char status[16] = {0};
// long timestamp;
// while (fscanf(fp, "%s %d %s", filename, ×tamp, status) != EOF) {
intmax_t timestamp_big;
while (fscanf(fp, "%63s %jd %15s", filename, ×tamp_big, status) == 3) {
time_t timestamp = (time_t) timestamp_big;
if (timestamp != timestamp_big) Handle_OutOfRangeError();
...
long timestamp
склонен к ошибке Y2038 .