2011-03-08 15 views
6

Estoy tratando de leer datos específicos de un archivo en dos matrices en 2D. La primera línea de datos define el tamaño de cada matriz, así que cuando complete la primera matriz, debo omitir esa línea. Después de omitir la primera línea, la primera matriz se llena con los datos del archivo hasta la séptima línea en el archivo. La segunda matriz se completa con el resto de los datos del archivo.Lectura de datos del archivo en la matriz

Aquí está una imagen etiquetada de mi archivo de datos: enter image description here

y es mi (defectuoso) código hasta ahora aquí:

#include <fstream> 
#include <iostream> 

using namespace std; 

int main() 
{ 
    ifstream inFile; 
    int FC_Row, FC_Col, EconRow, EconCol, seat; 

    inFile.open("Airplane.txt"); 

    inFile >> FC_Row >> FC_Col >> EconRow >> EconCol; 

    int firstClass[FC_Row][FC_Col]; 
    int economyClass[EconRow][EconCol]; 

    // thanks junjanes 
    for (int a = 0; a < FC_Row; a++) 
     for (int b = 0; b < FC_Col; b++) 
      inFile >> firstClass[a][b] ; 

    for (int c = 0; c < EconRow; c++) 
     for (int d = 0; d < EconCol; d++) 
      inFile >> economyClass[c][d] ; 

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

Gracias por la entrada de todo el mundo.

+1

'int firstClass [FC_Row] [FC_Col];' es un VLA que es C99, no C++. * Algunos compiladores * C++ lo soportan, aunque es malo para la portabilidad. – Erik

+0

+1 para su diagrama claramente ilustrado. MSPaint obtiene un +1 de mí :-) – corsiKa

+0

+1 por proporcionar una muestra de su programa. –

Respuesta

3

Sus loops iteran hasta el final del archivo, no los necesita.

while (inFile >> seat) // This reads until the end of the plane. 

usar en su lugar (sin el while):

for (int a = 0; a < FC_Row; a++)   // Read this amount of rows. 
    for (int b = 0; b < FC_Col; b++) // Read this amount of columns. 
     inFile >> firstClass[a][b] ; // Reading the next seat here. 

aplicar los mismos para asientos económicos.


También es posible que desee matrices de cambio en vectores, ya que las matrices de tamaño variable son demonios.

vector<vector<int> > firstClass(FC_Row, vector<int>(FC_Col)) ; 
vector<vector<int> > economyClass(EconRow, vector<int>(EconCol)) ; 

Necesitas #include <vector> usar vectores, su acceso es idéntico al de las matrices.

1

Estás leyendo en seat una vez que llenas la matriz con este valor. Luego está leyendo en seat nuevamente y completando la matriz con este nuevo valor.

Prueba esto:

int CurRow = 0; 
int CurCol = 0; 
while ((inFile >> seat) && (CurRow < FC_Row)) { 
    firstClass[CurRow][CurCol] = seat; 
    ++CurCol; 
    if (CurCol == FC_Col) { 
    ++CurRow; 
    CurCol = 0; 
    } 
} 
if (CurRow != FC_Row) { 
    // Didn't finish reading, inFile >> seat must have failed. 
} 

Su segundo bucle debe utilizar economyClass no firstClass

La razón para cambiar el lazo alrededor de este tipo es el manejo de errores, lo que se simplifica cuando el bucle termina en caso de error. Alternativamente, puede guardar los bucles for, use infile >> seat en el bucle interno, pero luego tendrá que salir de dos bucles si falla la lectura.

2

Es necesario cambiar el orden de los bucles for y la lectura del archivo:

for (rows = 0; rows < total_rows; ++ rows) 
{ 
    for (col = 0; columns < total_columns; ++cols) 
    { 
    input_file >> Economy_Seats[row][column]; 
    } 
} 

voy a dejar la comprobación de EOF y la manipulación de entrada no válida para el lector.

Cuestiones relacionadas