массивы — C ++ не будет читать данные научной нотации из файла .txt

Я пишу программу, которая читает в массив из текстового файла, который имеет как обычные целые числа, а также несколько чисел в научной записи, в форме: #. ##### E ##. Вот несколько примеров строк входного файла .txt:

       21   -1    0    0  501  502  0.00000000000E+00  0.00000000000E+00  0.17700026409E+03  0.17700026409E+03  0.00000000000E+00 0. -1.
21   -1    0    0  502  503  0.00000000000E+00  0.00000000000E+00 -0.45779372796E+03  0.45779372796E+03  0.00000000000E+00 0.  1.
6    1    1    2  501    0 -0.13244216743E+03 -0.16326397666E+03 -0.47746002227E+02  0.27641406353E+03  0.17300000000E+03 0. -1.
-6    1    1    2    0  503  0.13244216743E+03  0.16326397666E+03 -0.23304746164E+03  0.35837992852E+03  0.17300000000E+03 0.  1.

А вот моя программа, которая просто читает текстовый файл и помещает его в массив (или, точнее, вектор векторов):

vector <float> vec; //define vector for final table for histogram.
string lines;
vector<vector<float> > data; //define data "array" (vector of vectors)

ifstream infile("final.txt"); //read in text file

while (getline(infile, lines))
{
data.push_back(vector<float>());
istringstream ss(lines);
int value;
while (ss >> value)
{
data.back().push_back(value); //enter data from text file into array
}
}

for (int y = 0; y < data.size(); y++)
{
for (int x = 0; x < data[y].size(); x++)
{
cout<<data[y][x]<< " ";
}
cout << endl;
}
//  Outputs the array to make sure it works.

Теперь этот код прекрасно работает для первых 6 столбцов текстового файла (эти столбцы полностью целые), но затем он полностью игнорирует каждый столбец 6 и выше (это столбцы, содержащие номера научных обозначений).

Я попытался переопределить векторы как типы double и float, но это все равно делает одно и то же. Как я могу заставить C ++ распознавать научную нотацию?

Заранее спасибо!

2

Решение

+ Изменить int value; в double value; а также измените ваш вектор, чтобы удвоить вместо int.

Еще лучше, поскольку у вас есть три объявления, которые все должны быть синхронизированы с правильным типом, создайте псевдоним этого типа следующим образом: using DATA_TYPE = double; затем объявите ваши векторы и такие как это: vector<vector<DATA_TYPE> > data;, DATA_TYPE value;и т. д. Таким образом, если вы по какой-либо причине измените тип данных, все ваши объявления векторов и переменных будут обновляться автоматически, что позволит избежать ошибок такого рода.

3

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


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