求助!!!用c++写了个小程序读计算数据,数据文件小弟时候完美运行,可是超过100MB就提示错误

WDLIWEI 2016-11-03 11:06:54
首先谢谢愿意看贴的人,
本人C++新手,感到C++实在太难,非我所能驾驭,唉,扯远了。
最近写了个小程序用于处理一些数据,首先要读取一个data文件到矩阵,代码附在下文。
可是只要文件稍大(超过100MB)就提示错误:

data文件格式如下:
《《《《《《《《《《
ITEM: TIMESTEP
8000
ITEM: NUMBER OF ATOMS
320
ITEM: BOX BOUNDS pp pp pp
9.5755061075495718e-001 9.7642449389245201e+001
8.2926315432333197e-002 8.4560841658827925e+000
-2.4171224694622578e+002 2.4171224694622578e+002
ITEM: ATOMS x y z vx vy vz
61.3935 2.89044 -0.094552 -1.64324 -3.64242 -2.15481
61.392 4.26711 -0.0576012 0.418495 -6.14208 -6.88273
65.0559 0.762103 -0.55389 -7.4216 -5.6897 -3.54693
65.0384 2.159 -0.553472 -1.87542 2.5135 -10.6185
62.6162 0.789554 -0.217002 -5.85085 -4.60905 1.35167
62.6181 2.17501 -0.188577 -9.54565 -1.63078 1.8877
63.8082 2.86807 -0.435457 0.793098 3.16999 1.23847
63.8438 4.24847 -0.349354 -8.02932 4.1126 4.95989
67.4391 0.807745 -0.968005 9.04253 -2.99758 -2.34522
67.4071 2.18232 -0.860695 -4.12263 0.929896 -0.904826
66.2248 2.89868 -0.715047 -3.84407 -6.44841 0.298223
68.5864 2.88869 -1.02713 -5.17124 -1.08365 -3.18927
68.6407 4.25005 -0.978733 1.06514 -5.27396 -7.08119
69.7603 0.747057 -1.33939 -4.89614 1.42622 -0.565284
69.7783 2.12472 -1.2634 0.652406 10.2918 0.654858
70.9815 2.87145 -1.36507 8.61837 6.40154 2.07693
》》》》》》》》》》》》
程序代码读文件部分如下:
》》》》》》》》》
string filePath = "data.dat";
data.open(filePath, ios::in);//以只读方式打开
fo.open("phi.txt", ios::out);//输出phi矩阵
int nSkipCnt = 9;
if (data.is_open())
{
cout << "data opened" << "\n";
char szBuf[200];
for (int i = 0; i < nstep; ++i) {
for (int j = 0; j < nSkipCnt; ++j) {
data.getline(szBuf, sizeof(szBuf));//跳过前9行
}

for (int j = 0; j < N*Nj; ++j) {
//cout << j << "\t\t";
//fatom << "\n";
string linestring;
getline(data, linestring);//读取一行
//cout << linestring << "\t\t";
stringstream stringin(linestring);
double num;
vector<double> temp_atom;//以向量的形式保存整行数据
while (stringin >> num) {
temp_atom.push_back(num);
}
for (int k = 0; k < 6; ++k) {
atom[j][k][i] = temp_atom[k];
}
}
}
data.close(); // close the file
}
else // opening error
return 0;
《《《《《《《《《《《《
...全文
262 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
WDLIWEI 2016-11-03
  • 打赏
  • 举报
回复
引用 1 楼 qq423399099 的回复:
栈空间比较小,只有几M 试试堆上分配空间
请问如何操作?具体用那条命令? 按照你所说的不知道如何百度。 C++刚用了几天,谢谢
小灸舞 2016-11-03
  • 打赏
  • 举报
回复
栈空间比较小,只有几M 试试堆上分配空间
赵4老师 2016-11-03
  • 打赏
  • 举报
回复
在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 容量大小从小到大:栈≤全局数据≤堆≤文件≤硬盘≤磁盘阵列≤云存储 当程序需要使用比如2GB~1TB左右的存储时,最简单的办法恐怕得是用文件读写模拟内存读写了吧。windows参考_fseeki64函数,linux参考fseeko64函数。
ooolinux 2016-11-03
  • 打赏
  • 举报
回复
可以用全局数组变量,或者用new、malloc动态分配(堆内存)。
振翅高飞 2016-11-03
  • 打赏
  • 举报
回复
看你的报错感觉是内存溢出了。两个地方重点待查。 1: char szBuf[200]; data.getline(szBuf, sizeof(szBuf));//跳过前9行 这句重点查查,最好用std::string 2:stringstream stringin(linestring);这句是在循环内,频繁的构造,析构。设计的不好。

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧