Чтение чисел из файла в массив

Итак, у меня есть файл с тремя столбцами, например:

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";
}

В конечном счете, я хочу иметь двухмерный массив, связанный с интенсивностью. Любые идеи о том, почему я терплю неудачу? Он компилируется нормально, но когда он запускается, это выглядит так:

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 ()
===========================================================

0

Решение

В C ++

double c[1000, 1000];

Первые 1000 выбрасываются, и компилятор генерирует код для:

double c[1000];

То, что вы написали [1000, 1000], является многомерным массивом в Pascal, но не в C ++. В C ++ вы бы использовали:

double c[1000][1000];
2

Другие решения

Отображаемые вами ошибки генерируются ROOT. Поскольку это не форум ROOT, ROOT — это среда анализа данных на c ++, разработанная учеными из CERN. Для любопытных, их сайт Вот. Ваша проблема, однако, не связана с 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]
0

По вопросам рекламы [email protected]