локальная альтернатива, которая не будет перезаписывать предоставленную структуру - PullRequest
0 голосов
/ 18 января 2012

По сути, я пытаюсь проверить время последнего доступа к файлу и сравнить его со строкой.Вот соответствующий блок:

struct stat file;
char timeStr[ 100 ];

stat(nodes.at(0), &file);
strftime(timeStr, 100, "%H:%M:%S-%m/%d/%y", localtime(&file.st_atime)); /* problem */

nodes - вектор путей к файлам;Я не уверен, что это уместно, но я включу код, который я использую для установки nodes:

vector<char*> nodes;
DIR *dir;
struct dirent *cur

if((dir = opendir(searchPath.c_str())) == NULL) {
    cout << "Error opening search path. Are you sure '" 
        << searchPath.c_str() << "' is a valid search path?" << endl;
    return 0;
}
while((cur = readdir(dir)) != NULL) {
    if(string(cur->d_name) == "." || string(cur->d_name) == "..") continue;
    nodes.push_back(cur->d_name);
}
closedir(dir);

Где searchPath - строка, введенная пользователем.

Проблема: когда запускается строка «проблема», с этого момента nodes является вектором мусора.Мне интересно, смогу ли я выполнить эту задачу, не превращая nodes в мусор.

Поскольку это домашняя работа, и, как вы, вероятно, можете сказать, я не привык к C ++, твердый толчок в правильном направлениибудет дано согласие.

Спасибо.

Ответы [ 2 ]

1 голос
/ 18 января 2012

Это не имеет ничего общего с вашим вызовом strftime, но с тем фактом, что (с здесь ):

Указатель, возвращаемый readdir (), указывает на данные, которыеможет быть перезаписано другим вызовом readdir () в том же потоке каталога.

Поскольку вы просто нажимаете символьный указатель, который указывает на данные, которые могут быть перезаписаны последующими вызовами readdir,вы вполне можете получить мусор.

Вы, вероятно, можете это исправить, используя копию строки C с чем-то вроде:

nodes.push_back (strdup (cur->d_name)); // plus error handling if need be.

И, если вашреализация не имеет strdup (это не является частью стандарта), вы можете использовать мой (найдено здесь ).

1 голос
/ 18 января 2012
nodes.push_back(cur->d_name);

Вы сохраняете указатели в векторе, которые немедленно становятся недействительными (cur действует до следующего вызова readdir или closedir).Лучшее решение - это написать то, что вы хотите - сделать nodes вектором string с.Самое простое исправление:

nodes.push_back(strdup(cur->d_name));
...