LINUX.ORG.RU

проблема с функцией stat()


0

1

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

void FindFile(char *folder, vector<string> spisok)
{
const string rasshirenie = ".mp3";
DIR *directory;
struct dirent *dir;
struct stat buf;
string name;
directory = opendir(folder);
while((dir = readdir(directory)) != NULL)
{
name = dir -> d_name;
if(name.compare(".") && name.compare(".."))
{
lstat(&name[0], &buf);
if(S_ISDIR(buf.st_mode)) //не выполняется это условие
FindFile(&name[0], spisok);
if(S_ISREG(buf.st_mode))
{
name = name.substr(name.length() - 4);
if(name.compare(rasshirenie))
spisok.insert(spisok.end(), name);
}
}
}
}


Проверяй, что lstat() завершается успешно и ты не читаешь неинициализированные данные в стеке.

Deleted
()
Ответ на: комментарий от Deleted

спасибо lstat действительно не срабатывала

K0ND0R
() автор топика
Ответ на: комментарий от anonymous

и? lstat() и ожидает получить const char*.

Фишка-то в том, что lstat(), как самая традиционная С-функция, ожидает работать с С-строками. Каков у нас признак окончания С-строки? Правильно, нулевой байт.

std::string::c_str() и возвращает указатель на последовательность символов, заканчивающуюся нулевым байтом.

А вот ТС-овский быдлометод &name[0] суть получение указателя первый элемент в буфере строки, равносилен &(name.data()[0]), что есть в абсолютно неправильно, ибо std::string::data() возвращает указатель на внутренний буфер, который не является нулевым байтом.

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

>на внутренний буфер, который не является нулевым байтом.

который не заканчивается нулевым байтом, конечно-же

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

проблема была в том что я передавал 1 аргументом имя файла, а надо было передавать полное имя файла. Исправив, чтоб передавало имя файла с путем функция lstat стала нормально отрабатывать

K0ND0R
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.