& quot; retsize & lt; = sizeInWords & quot; в mbstowcs в dirent.h на Windows

Исходная информация:

Я строю дерево файлов в Windows, используя dirent.h (требование проекта) на VS2013. Я получил dirent.h от Вот. Сбой во время выполнения с ошибкой утверждения отладки («retsize <= sizeInWords «) из crt \ crtw32 \ mbstowcs.c, строка 283.

Для тестирования dirent.h я использовал

void printDir(std::string dir, std::string tab)
{
DIR* d = opendir(dir.c_str());
dirent* ent = nullptr;
while (ent = readdir(d)) {
if (ent->d_name[0] != '.') {
std::cout << tab << ent->d_name << std::endl;
if (ent->d_type == DT_DIR) {
printDir(dir + "/" + ent->d_name, tab + "  ");
}
}
}
}

который работал (вызывается из main как printDir («.», «»))

Итак, чтобы построить мое дерево у меня есть:

struct Dirf {
std::string getFullPath() {
if (out) {
return out->getFullPath() + "/" + ent.d_name;
}
else return ent.d_name;
}

Dirf(DIR* dir, Dirf* parent = nullptr)
: out(parent)
{
if (dir) {
dirent* d = readdir(dir);
if (d) {
ent = *d;
if (dir) {
next = std::make_shared<Dirf>(dir, parent);
}
if (ent.d_type == DT_DIR) {
DIR* inDir = opendir(getFullPath().c_str());
in = std::make_shared<Dirf>(inDir, this);
closedir(inDir);
}
}
}
}

private:
typedef std::shared_ptr<Dirf> point;
friend  std::string to_string(Dirf, std::string);

dirent ent;
Dirf* out; // parent to this; in->out == this, out->in == this;
point in, // in != null iff car.d_type == DT_DIR
next; // next entry in the dir
};

std::string to_string(Dirf, std::string tab = "");

Однако вызов Dirf (opendir («.»)) Завершается неудачно с утверждением отладки, описанным выше.

0

Решение

При составлении вопроса я разобрался с ответом: я забыл проверить «.» и «..» в конструкторе Dirf (я вспомнил, что делал это в моем тестовом примере). Добавление

while (d && d->d_name[0] == '.') { // skip '..' and '.'
d = readdir(dir);
}

после dirent* d = readdir(dir) сделал ошибку уйти.

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector