2016-02-27 3 views
2

Я работаю над программой, в которой у меня есть входной файл, содержащий имена состояний, и три отдельных налога для каждого штата: налог с продаж, налог на имущество, и подоходный налог. Я пытаюсь читать налоговые значения (считанные как двойные переменные) в массив типа double. Вот мой код:C++ Чтение двойных значений в 2D-массив из файла, содержащего как строки, так и удвоенные

#include <iostream> 
#include <fstream> 
#include <iomanip> 
#include <string> 
using namespace std; 

int main() 
{ 
    double a = 0, 
     b = 0, 
     c = 0; 
    double array[5][3]; 
    string state_name; 
    ifstream fin; 
    fin.open("test.dat"); 

    for (; fin >> state_name >> a >> b >> c;) 
    { 
     for (int i = 0; i < 5; i++) 
     { 
      for (int j = 0; j < 3; j++) 
      { 
      fin >> array[i][j]; 
      cout << array[i][j] << "\t"; 
      } 
      cout << endl; 
     } 
    } 


    return 0; 
} 

Вот файл данных:

TEXAS  .0825 .02 -.03 
    CALIFORNIA .065 .04 .05 
    MARYLAND  .03 .025 .03 
    MAINE  .095 .055 .045 
    OHIO   .02 .015 .02 

И от этого, программа выводит массив, за исключением того, что каждая позиция читает -9.25596e + 061. Мне было интересно, было ли это потому, что программа пыталась прочитать строку в массиве. Мне также было интересно, есть ли способ игнорировать строку в строке строки за строкой, так что в массив считываются только двойные значения.

+0

Вы должны использовать 'while (fin >> state_name >> a >> b >> c)' вместо цикла for. Ваш смысл яснее. –

ответ

0

Вы читаете всю строку в цикле for. Вам не нужно будет делать fin >> array[i][j] позже. Вместо этого вы должны делать это:

for (int i = 0; i < 5; i++) 
{ 
    fin >> state_name; 
    for(int j = 0; j < 3; ++j) 
    { 
     fin >> array[i][j]; 
     cout << array[i][j] << '\t'; 
    } 
    cout << endl; 

    if(!fin) 
    { 
     // handle an error reading the file 
    } 
} 
+0

Я скорректировал код, чтобы включить 'fin >> state_name;' и программа запускала большую часть файла, но не выводила '.0825 .02 -.03' для Texas. Кроме того, последняя строка в массиве все еще '-9.25596e + 061', но другие значения прошли через штраф. Интересно, есть ли что-то еще здесь. –

+0

Вы неправильно поняли мой код замены. Приведенный выше код должен заменить весь ваш 'for (; fin >> state_name >> a >> b >> c;) {...}' loop –

+0

Что-то вроде этого когда-либо делалось внутри цикла for-read? Или было бы возможно сделать то же самое в цикле для чтения? –

0

Это должно сделать работу:

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int main() { 

    double array[5][3]; 
    string state_name; 

    ifstream fin; 
    fin.open("test.dat"); 

    // Read the file row by row 
    int row =0; 
    while(fin >> state_name >> array[row][0] >> array[row][1] >> array[row][2]) { 
     ++row; 
    } 

    // Print the result 
    for(int i = 0; i < 5; i++) { 
     for(int j = 0; j < 3; j++) { 
      cout << array[i][j] << "\t"; 
     } 
     cout << endl; 
    } 

    return 0; 
} 

Если вы позволите мне думать один шаг дальше, вы, вероятно, предпочитают, чтобы подтолкнуть каждую строку в вектор, а не статический массив. В противном случае вам нужно переписать код, если файл будет содержать более 5 строк.

Смежные вопросы