Почему на матрицу не выделяется память?

Я хочу обращаться к одной директории и получать названия всех файлов в ней.Затем прочитать содержимое этих бинарных файлов в матрицу(содержимое каждого файла в отдельную строку матрицы). Но в отладчике вижу, что 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
}
→ Ссылка