在c ++中读取大型.txt文件时出现奇怪的错误

时间:2016-11-04 16:41:31

标签: c++

我试图读取一个非常大的.txt文件,该文件包含128x128x128 = 2097152行(linearised 3d space),只包含一行0或1行(不要问为什么)...我修剪了将我的代码缩小到几行,似乎当我输出行和增量时,一切顺利......但是一旦我想将数据放入一个足够允许的数组中,行读数就停止在i = 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;

这是我在收到错误之前得到的最后一个输出...这很奇怪,因为每当我在while内部评论hu_temp行时,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)

1 个答案:

答案 0 :(得分:6)

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

那些是包含值dim的1-char数组。在某些时候,你正在击中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