Вы допустили несколько ошибок, наиболее важным из которых является вызов stat()
без проверки его возвращаемого значения. Я изменил вашу программу так:
#include <cstdio>
#include <dirent.h>
#include <iostream>
#include <string>
#include <sys/stat.h>
using namespace std;
int main() {
string s = "/home/";
struct dirent *file;
DIR *dir = opendir(s.c_str());
while ((file = readdir(dir)) != NULL) {
struct stat file_info;
if (stat(file->d_name, &file_info) == -1) {
perror("stat");
return 1;
}
if (S_ISDIR(file_info.st_mode))
cout << "dir " << file->d_name << endl;
else
cout << "other " << file->d_name << endl;
}
closedir(dir);
}
Когда я запустил его, я получил такой вывод:
$ ./a.exe
dir .
dir ..
stat: No such file or directory
Теперь я увидел, что stat
вызывается с именем файла roland
, которого нет в моем текущем рабочем каталоге. Вы должны поставить префикс файлов перед именем каталога.
Вашей второй ошибкой было выделение нового struct stat
каждый раз, но не освобождение памяти после использования. По умолчанию в C ++ нет сборки мусора, поэтому вашей программе скоро не хватит памяти.