Создание одномерного динамического массива на языке C++

Необходимо считать первый элемент файла и по нему создается одномерный массив. Прошлась отладчиком, при вводе переменная принимает значение из файла, но размер массива все равно равен 1. На скриншоте создание массива и значение переменной и массива после выполнения соответствующих строк кода.

Одномерный массив необходим для хранения в нем индексов строк, удовлетворяющих условию: в строке должно быть минимум 2 числа. ниже приведен код для реализации выше поставленной задачи.

ifstream f;
f.open(name, ios::in);

if (!(f.is_open())) { cout << "Ошибка открытия входного файла!"; }

f >> t;
int* arr_control = new (nothrow) int[t];
if (arr_control == nullptr) {
    cout << "Ошибка выделения памяти!";
}
else {
    f.unsetf(std::ios_base::skipws);
    char read_symbol = '+', last_symbol = '!';
    int element_in_str = 0, skip = -1, n = -1;

    while (!f.eof()) {

        last_symbol = read_symbol;
        f >> read_symbol;

        if (read_symbol == '\n') {
            skip++;
            element_in_str = 0;
        }

        else if (number_yes_no(read_symbol) == 1 and number_yes_no(last_symbol) == 0) {
            element_in_str++;
            if (element_in_str >= 2) {

                if (arr_control != nullptr) {
                    n++;
                    arr_control[n] = skip;
                    element_in_str = 0;
                }
            }
        }
    }
}


f.close();

Ответы (1 шт):

Автор решения: NunOfIt

Вы выделили память в куче и адрес её начала записали в указатель arr_control. Ваш отладчик идёт по этому адресу и выдаёт вам первый int (первые 4 байта), который лежит по этому адресу, т.к. отладчик не знает сколько именно памяти вы выделили. + вы забыли освободить выделенную память delete[] arr_control;, а это уже утечка памяти и не есть хорошо, в данном случае, правда, оно не сильно-то и важно, но всё-же

А в целом, зачем вам вообще тут использовать оператор new? Лучше не изобретать велосипед, а ездить на уже готовом: std::vector, и это средство передвижения вам позволит не просто не беспокоиться об утечках памяти, а даже не указывать, количество элементов, которые вы собираетесь ввести, хотя можно и указать, через .reserve...

#include <vector>
#include <clocale>
#include <fstream>
#include <iostream>

bool isNumber(char c) {
    return c >= '0' && c <= '9';
}

char print(const std::vector<int>& vec) {
    std::cout << '[';
    if(!vec.empty()) {
        std::cout << vec[0];
        for(size_t i = 1; i < vec.size(); ++i)
            std::cout << ", " << vec[i];            
    }
    std::cout << ']';
    return '\0';
}

int main() {
    setlocale(LC_ALL, "");
    std::ifstream stream("my_file.txt");

    if(!stream.is_open()) {
        std::cout << "Ошибка открытия входного файла!\n";
        stream.close();
        return 0;
    }

    char c;
    bool key = false;
    int count = 0, i = 0;
    std::vector<int> res;

    while(true) {
        stream.read(&c, 1);

        if(!key && isNumber(c)) { key = true; }
        else if(key && !isNumber(c)) {
            ++count;
            key = false;
        }

        if(c == '\n') {
            if(count >= 2) { res.push_back(i); }

            ++i;
            count = 0;
        }

        if(stream.eof()) {
            if(key) { ++count; }
            if(count >= 2) { res.push_back(i); }
            break;
        }
    }

    std::cout << "res: " << print(res) << '\n';
    stream.close();
    return 0;
}
→ Ссылка