C ++: переименовать все файлы в каталоге

Список того, что было достигнуто и что я застрял, чтобы помочь понять, что я спрашиваю

Чего я достиг:

Откройте указанный пользователем каталог, отобразите все файлы в этом каталоге.

Чего я еще не достиг:

Переименуйте все файлы в этом каталоге автоматически в соответствии с заранее заданным именем — Файлы в настоящее время называются случайными символами, я хочу автоматически переименовать их в «1 августа», «2 августа», «3 августа» и т. Д. Файлы имеют разные расширения, и я хочу, чтобы расширения остались прежними.

Вот как я открываю и отображаю каталог:

void DirectorySelector::OpenDirectory(void)
{
// convert directory string to const char
DIRECTORY = directory.c_str();

pdir = opendir (DIRECTORY);
}

void DirectorySelector::DisplayDirectory(void)
{
// read directory
while (pent = readdir (pdir))
{
std::cout << pent->d_name << "\n";
}
}

И это то, что я застрял, переименовывая файлы (файлы имеют различные расширения, не уверен, если это вызовет проблемы в дальнейшем?)

Я получаю следующую ошибку, как только программа запускает цикл while:

Необработанное исключение в 0x009657C1 в MultipleRename.exe: 0xC0000005: Место чтения нарушения доступа 0xCCCCCDE0.

void DirectoryOperator::StandardRename(void)
{
i = 1;

while (pent = readdir (pdir))
{
oldname = pent->d_name;
newname = "August " + i;

OLDNAME = oldname.c_str();
NEWNAME = newname.c_str();

rename(OLDNAME, NEWNAME);
i++;
}
}

Примечание. Все объявления обрабатываются в другом месте и для простоты убрали проверку, если вам нужен код, я могу опубликовать его.
Также я уже проверил, что каталог все еще открыт в классе DirectoryOperator, и я использую MSVS2012 в Windows.

Заранее спасибо.

0

Решение

Есть проблема со строкой:

newname = "August " + i;

«Август» — это символ *, и я добавляюсь в указатель до того, как он будет преобразован в std :: string.

Таким образом, когда я == 1, ваша строка будет «ужасной», а когда это 2, это будет «порыв». Очень быстро, когда я> 8, вы столкнетесь с неопределенным поведением.

Решения:

newname = "August " + std::to_string(i); // c++11

или же

#include<sstream>
...
stringstream ss;
ss << "August " << i;
newname = ss.str();
2

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

«Я получаю следующую ошибку, как только программа запускает цикл while:»

Unhandled exception at 0x009657C1 in MultipleRename.exe: 0xC0000005: Access violation reading location 0xCCCCCDE0.

Скорее всего pdir неправильно инициализируется, когда код

while (pent = readdir (pdir))

называется. Значение 0xC0000005 означает, что вы пытаетесь разыменовать nullptr где-то.

Вы уверены, что

pdir = opendir (DIRECTORY);

был вызван в последовательности, как предполагалось, и результат был действительным (pdir != nullptr)?

1

По вопросам рекламы [email protected]