Присвоение значений указателям внутри цикла while (используя & lt; dirent.h & gt;)

Допустим, у меня есть 3 файла с расширением «.exe» в папке c: /.
И я хочу создать 3 указателя типа char *, каждый из этих указателей содержит имя файла .exe-файла. Итак, у нас есть 3 указателя — 3 имени файла.
Но вывод — это то, что действительно смущает меня (см. Ниже).

Моя реализация:

#include <dirent.h>

// some code here

DIR *dir;
struct dirent *ent;
char** FileName = new char* [3]; // Creating 3 pointers of type char*
count = 0; //counting the events when .exe file detected
dir = opendir("c:/");
while ((ent = readdir (dir)) != NULL) // read directory file by file until there is nothing
{
string matchName = string(ent->d_name);
if (matchName.find(".exe") != std::string::npos) // Finding files with
//.exe extension only
{
FileName[count] = ent->d_name;
cout << "count = " << count << ": " << FileName[count] << endl;
count++; // There are 3 .exe files in the folder, so the maximum
// of the count=3 (from FileName[0] to FileName[2])
}
}
closedir (dir);

// Here I'm just checking the output
cout << "count = 0: " << FileName[0] << endl;
cout << "count = 1: " << FileName[1] << endl;
cout << "count = 2: " << FileName[2] << endl;

Мой вывод:

//from inside the while-loop:
count = 0: file0.exe
count = 1: file1.exe
count = 2: file2.exe

//from when I just check the output outside the loop
count = 0:  // just empty for all 3 files
count = 1:
count = 2:

Почему я ожидал присваивания (по крайней мере, ожидаемого), пока я нахожусь внутри цикла while, но тогда, когда я проверяю те же значения указателей вне цикла — он просто пуст?
Спасибо!

1

Решение

Это проблема:

FileName[count] = ent->d_name;

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

Самый простой способ сделать это — изменить FileName чтобы:

std::string FileName[3];

хотя было бы не намного больше усилий, чтобы использовать std::vector<std::string> FileName; правильно, тогда у вас нет ограничений на 3 файла.

2

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

Может быть, ваши данные перезаписаны? Цитата из справки readdir:
The data returned by readdir() may be overwritten by subsequent calls to readdir() for the same directory stream,
Таким образом, вы должны скопировать массив символов вместо назначения сырых указателей символов

1