Почему на матрицу не выделяется память?
Я хочу обращаться к одной директории и получать названия всех файлов в ней.Затем прочитать содержимое этих бинарных файлов в матрицу(содержимое каждого файла в отдельную строку матрицы). Но в отладчике вижу, что 0x009c5be0 {0xcdcdcdcd <Ошибка при чтении символов строки.>} у переменной memblock после memblock = new char*[(counter+1)];. Вот сам код:
void find_bounds()
{
int counter = 0;
//в директории узнаём названия файлов,чтобы по ним пройтись
WIN32_FIND_DATA data;
char** memblock;
HANDLE hFind = FindFirstFile("C:\\Users\\Elvin\\Documents\\all_configs\\*", &data); //
if (hFind != INVALID_HANDLE_VALUE)
{
do {
std::cout << data.cFileName << std::endl;
memblock = new char*[(counter+1)];//хочу на каждый файл досоздавать новую строку
streampos size;
string temp_name = data.cFileName;
//temp_name = temp_name + ".bin";
ifstream file("C:\\Users\\Elvin\\Documents\\all_configs\\"+temp_name, ios::in | ios::binary | ios::ate);
if (file.is_open())
{
size = file.tellg();
memblock[counter] = new char[size];//выделяю столбцы для новой строки, но память не выделяется, пишет "Ошибка при чтении символов строки"
file.seekg(0, ios::beg);
file.read(memblock[counter], size);//запись данных в строку матрицы
file.close();
counter++;
cout << "the entire file content is in memory";
//delete[] memblock;
}
//else cout << "Unable to open file";
} while (FindNextFile(hFind, &data));
FindClose(hFind);
}
}
Но к сожалению, на матрицу memblock память не выделяется даже в самый первый раз,как можно решить эту проблему?
Ответы (1 шт):
Автор решения: ヒミコ
→ Ссылка
Как-то так, или используйте контейнеры std:
void find_bounds()
{
size_t counter = 0;
WIN32_FIND_DATA data{};
char** memBlock = nullptr;
HANDLE hFind = FindFirstFile(R"(C:\Users\Elvin\Documents\all_configs\)", &data);
if (hFind != INVALID_HANDLE_VALUE)
{
do
{
std::cout << data.cFileName << std::endl;
char** oldDataPtr = memBlock;
memBlock = new char*[counter + 1];
std::memmove(memBlock, oldDataPtr, sizeof(char*) * counter);
delete[] oldDataPtr;
std::string temp_name = data.cFileName;
std::ifstream file(R"(C:\Users\Elvin\Documents\all_configs\)" + temp_name,
std::ios::in | std::ios::binary | std::ios::ate);
if (file.is_open())
{
file.seekg(0, std::ifstream::end);
const std::size_t size = file.tellg();
memBlock[counter] = new char[size + 1];
memBlock[counter][size] = '\0';
file.seekg(0, std::ifstream::beg);
file.read(memBlock[counter], size);
std::cout << memBlock[counter] << std::endl;
file.close();
counter++;
std::cout << "the entire file content is in memory" << std::endl;
}
else std::cout << "Unable to open file";
}
while (FindNextFile(hFind, &data));
FindClose(hFind);
}
for (size_t i = 0; i < counter; i++)
{
delete[] memBlock[i];
}
delete[] memBlock; // or use it
}