每个人...
我是C ++的新手... 我的问题是关于在C ++ Visual Studio 2012中读取大文本文件...
这是我的简单代码:
#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
int main() {
double x;
int i,j;
ifstream inFile;
i=0;
j=0;
double x_array[800050][1] ;
x = 0;
inFile.open("D:\\a.txt");
if (!inFile) {
cout << "Unable to open file";
exit(1); // terminate with error
}
while (inFile >> x) {
x_array[i][0]=x;
i++;
}
inFile.close();
return 0;
}
但是当我调试代码时,遇到此错误:
textreader.exe中0x01242327的未处理异常:0xC00000FD:堆栈溢出(参数:0x00000000,0x00E42000)。
当我减小输入文本文件的大小(减小输入数量)时,问题就解决了...但是我需要整个输入文本文件...
我该怎么办?问题出在代码中还是我应该找到更好的方法?
答案 0 :(得分:2)
通常将自动变量放在调用堆栈中。在大多数台式机系统上,调用堆栈的默认大小为1到几兆字节。 double [800050][1]
的大小超过6兆字节(假设double的大小为8字节)。如您所见,使用如此巨大的自动变量的结果会导致堆栈溢出。
请勿对大型对象使用自动变量。您可以改为动态分配对象。在这种情况下,您可以使用std::vector<double>
。
另一个问题是,您已经对数组的大小进行了硬编码,因此即使数组确实适合堆栈,也有使数组溢出的风险。使用std::vector
时,可以让它动态增长,而不必对大小进行硬编码。
答案 1 :(得分:0)
您(如错误所述)在分配时发生堆栈溢出:
double x_array[800050][1] ;
您应该尝试在堆上分配它(直接使用new或间接使用std :: vector这样的std容器)