从文件中读取数字到数组中

时间:2013-03-06 13:26:29

标签: c++ arrays file root-framework

所以我有一个包含三列的文件,例如:

1 1 750

这些是x,y,强度值。

然后我尝试将这个长文件读入数组。这是到目前为止的代码:

using std::cout;
using std::endl;
using std::string;

string fOutFileName("gaintest.root"); 


int main()
{

  std::ifstream file1("data_p30.dat");

  double intensity;
  int i;
  int j ;
  double c[1000][1000];
if (file1.is_open()) {
    file1.seekg(0);
    while (!file1.eof()) {
      file1 >> i >> j >> intensity;
      c[i][j]=intensity;
      cout<<c[i][j]<<'/n'; 
    }
    file1.close();
  } else cout << "Error, cannot open file 1";
}

所以最终我希望能够拥有一个与强度相关联的2D数组。关于我为什么失败的任何想法?它编译得很好但是当它运行时,它看起来像这样:

root [0] 
 *** Break *** segmentation violation



===========================================================
There was a crash.
This is the entire stack trace of all threads:
===========================================================
#0  0x0000003701098c05 in waitpid () from /lib64/libc.so.6
#1  0x000000370103c481 in do_system () from /lib64/libc.so.6
#2  0x00002b036f5ebc6a in TUnixSystem::StackTrace() ()
   from /batchsoft/root/root528-x86_64-slc5-43/lib/libCore.so
#3  0x00002b036f5eb63c in TUnixSystem::DispatchSignals(ESignals) ()
   from /batchsoft/root/root528-x86_64-slc5-43/lib/libCore.so
#4  <signal handler called>
#5  0x00002b0370acd515 in TRint::Run(bool) ()
   from /batchsoft/root/root528-x86_64-slc5-43/lib/libRint.so
#6  0x000000000040106d in main ()
===========================================================


The lines below might hint at the cause of the crash.
If they do not help you then please submit a bug report at
http://root.cern.ch/bugs. Please post the ENTIRE stack trace
from above as an attachment in addition to anything else
that might help us fixing this issue.
===========================================================
#5  0x00002b0370acd515 in TRint::Run(bool) ()
   from /batchsoft/root/root528-x86_64-slc5-43/lib/libRint.so
#6  0x000000000040106d in main ()
===========================================================

2 个答案:

答案 0 :(得分:2)

在C ++中

double c[1000, 1000];

抛弃前1000个,编译器为以下代码生成代码:

double c[1000];

你写的[1000,1000]是Pascal中的多维数组,但不是C ++中的数组。在C ++中,您将使用:

double c[1000][1000];

答案 1 :(得分:0)

您显示的错误由ROOT生成。由于这不是ROOT论坛,ROOT是由CERN科学家开发的c ++数据分析框架。对于好奇的人来说,他们的网站是here。但是,你的问题与ROOT无关。

2D数组由

声明
double a[2][2];

这对你有用。

使用模板类

可能更安全
std::vector<double> v;

对于2D应用程序,这看起来像

std::vector<std::vector<double> > v2;

这样做的好处是可以根据需要调整其大小和

v.push_back(d);

将向量的末尾添加一个元素,必要时将其拉长。也可以使用类似

的数组语法访问元素
v[1] 

v2[1][2]