Я пытаюсь сравнить текущее время с измененным временем даты файла и испытываю странную проблему. У меня есть структура tm *, которая содержит время, когда файл был изменен, но он изменяется на текущую дату после вызова времени (NULL).
Мой код:
printf("month: %d\n", tmst->tm_mon);
time_t curTime = time(NULL);
printf("month: %d\n", tmst->tm_mon);
struct tm * curSt = localtime ( &curTime );
printf("month: %d\n", tmst->tm_mon);
.. где st
- struct stat
для файла. Выход:
month: 11
month: 5
Почему это? Что я должен делать по-другому?
Из документации:
Возвращаемое значение указывает на внутренний объект, срок действия которого или его значение могут быть изменены любым последующим вызовом gmtime или localtime.
Прочитайте документацию.
Документация рассказывает вам, как работают функции.
(То, что localtime
возвращает указатель, является большой подсказкой: кто, по вашему мнению, освобождает pointee?: D)
Как указано в localtime(3)
странице руководства:
Возвращаемое значение указывает на статически выделенную структуру, которая может быть перезаписана последующими вызовами любой из функций даты и времени.
Вам нужно скопировать значение, если вы не хотите, чтобы он был изменен из-под вас, например:
// Dereference and copy the result:
struct tm tmst = *localtime ( &st.st_mtime );
Вы также можете использовать вариант реентера localtime_r
для копирования результата в переданный в него параметр, но обратите внимание, что эта функция не переносима.
struct tm
. Этоstruct tm*
.