Создание одномерного динамического массива на языке 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 шт):
Вы выделили память в куче и адрес её начала записали в указатель 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;
}
