2016-11-04 2 views
0

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

вот код

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 линию внутри т он в то время, то соиЬ в одиночку работает до 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) 

ответ

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

те 1-символьные массивы, содержащие значение 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() дает размер и много очень приятных особенностей лучше описанных here)

+0

Я сейчас чувствую себя глупо лол ... но благодаря кучу ... это было рассмотрено 3-х человек и работал для много времени, прежде чем отправлять его на стек ... Я думаю, нам нужно некоторое пространство от нашего кода ... – Feynstein

+0

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

+0

Да, но мне сложно их обработать позже в моем коде, так как это все смешанное с CUDA ... Я бы обычно использовал векторы, но потом мне нужно с ними работать, прежде чем отправлять их на GPU. – Feynstein