localtime() и gmtime(), похоже, портят мой входной поток C++/C

У меня проблемы с преобразованием времени эпохи unix в массив символов. Я знаю, как это сделать, и преобразование происходит правильно, но после вызова gmtime() или localtime() ко всем входным данным добавляются случайные символы. Я зафиксировал проблему, и ТОЛЬКО строки, вызывающие localtime() или gmtime(), вызывают эту проблему (серьезно... Они у меня есть, и проблема возникает, я их комментирую, переделываю, и проблема больше не возникает). Вот функция, в которой вызывается функция:

void ls(){

int clusterSize = bootRecord[0];
int root = bootRecord[2];

for (int i = 0; i < bootRecord[0] / 128 ; ++i){
    fseek(fp, clusterSize * root + 128 * i, SEEK_SET);
    if(directoryTable[i].name[0] != 0x00){

        time_t rawtime = (time_t)directoryTable[i].creation;
        struct tm * curDate;

        curDate = localtime(&rawtime);

        printf("%s     %d      %s", directoryTable[i].name, directoryTable[i].size,
                        asctime(gmtime(&rawtime)));

    }
}
}

Прямо сейчас у меня есть asctime(gmtime(&rawtime)) но я пытался разделить их на несколько разных операторов, но безрезультатно. Кто-нибудь знает полезную альтернативу localtime() или gmtime()? Или случайно не знаете решение именно этой проблемы? Спасибо.


person Tom    schedule 16.02.2012    source источник
comment
Вы пробовали использовать gmtime_r() и/или localtime_r()? Эти две функции работают с struct tm, выделенными вызывающей стороной, и поэтому в целом более безопасны.   -  person Pavel Zhuravlev    schedule 16.02.2012


Ответы (1)


Какой бы ни была ваша проблема, она не связана с тем, как вы используете функции времени. Следующая программа работает нормально:

#include <stdio.h>
#include <time.h>

int main (void) {
    time_t now = time(0);
    printf ("Local time is %s", asctime (localtime (&now)));
    printf ("  UTC time is %s", asctime (gmtime (&now)));
    return 0;
}

распечатка:

Local time is Thu Feb 16 14:15:51 2012
  UTC time is Thu Feb 16 06:15:51 2012

как и ожидалось.

Вам нужно более четко указать, что означает all input gets random characters appended to to. Если вы имеете в виду, что строки, которые вы вводите, кажутся добавленными к ним символами, то это почти наверняка другая проблема, которая просто усугубляется вызовами функций.

Я бы сначала искал (в качестве примера) буферы, которые могут быть переполнены, или логику кода, которая не передает нулевые терминаторы.

person paxdiablo    schedule 16.02.2012