Список того, что было достигнуто и что я застрял, чтобы помочь понять, что я спрашиваю
Чего я достиг:
Откройте указанный пользователем каталог, отобразите все файлы в этом каталоге.
Чего я еще не достиг:
Переименуйте все файлы в этом каталоге автоматически в соответствии с заранее заданным именем — Файлы в настоящее время называются случайными символами, я хочу автоматически переименовать их в «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.
Заранее спасибо.
Есть проблема со строкой:
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();
«Я получаю следующую ошибку, как только программа запускает цикл 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
)?