Странная ошибка при чтении большого файла .txt в С++ - программирование
Подтвердить что ты не робот

Странная ошибка при чтении большого файла .txt в С++

Я пытаюсь прочитать очень большой файл .txt, который имеет 128x128x128 = 2097152 строк (линеаризованное трехмерное пространство), содержащее только один 0 или 1 за строкой (не спрашивайте, почему)... Я скосил мой код, чтобы несколько строк, и кажется, что когда я заканчиваю строку и приращение, все идет хорошо... но как только я хочу поместить данные в достаточно разрешенный массив, чтение строки останавливается при я = 12286...

здесь код

int dim = nbvox[0]*nbvox[1]*nbvox[2];
float* hu_geometry = new float(dim);
int* hu_temp = new int(dim);
string line;

int i = 0;


ifstream in(hu_geom_file.c_str());
if(in.is_open())
{
  while(getline(in, line))
  {

    hu_temp[i] = stoi(line);
    cout << "i= " << i << " line= " << line << " hu_temp= " << hu_temp[i] << endl;
    i++;
  }
  cout << __LINE__ << " i=" << i << endl;
  in.close();
  cout << __LINE__ << endl;
}
else cout << "Unable to open " << hu_geom_file << endl;

Вот последний вывод, который я получаю до получения ошибки... что очень странно, потому что всякий раз, когда я прокомментирую строку hu_temp внутри while, только cout работает до 2097152.

i= 12276 line= 0 hu_temp= 0
i= 12277 line= 0 hu_temp= 0
i= 12278 line= 0 hu_temp= 0
i= 12279 line= 0 hu_temp= 0
i= 12280 line= 0 hu_temp= 0
i= 12281 line= 0 hu_temp= 0
i= 12282 line= 0 hu_temp= 0
i= 12283 line= 0 hu_temp= 0
i= 12284 line= 0 hu_temp= 0
i= 12285 line= 0 hu_temp= 0
115 i=12286
*** Error in `G4Sandbox': free(): invalid pointer: 0x0000000001ba4c40 ***
Aborted (core dumped)
4b9b3361

Ответ 1

float* hu_geometry = new float(dim);
int* hu_temp = new int(dim);

это массивы 1- char, содержащие значение dim. В какой-то момент вы попадаете на границу MMU и случайно выходят из строя.

Вы хотите написать:

float* hu_geometry = new float[dim];
int* hu_temp = new int[dim];

или, может быть, лучше с векторами, предварительно выделенными dim элементами

#include <vector>
std::vector<float> hu_geometry(dim);
std::vector<int> hu_temp(dim);

или не указано в начале:

std::vector<int> hu_temp;

и в вашем коде:

hu_temp.push_back(stoi(line));

(hu_temp.size()дает размер и много очень приятных функций, более подробно описанных здесь)