将数据从文件读入数组

时间:2011-03-08 23:37:40

标签: c++

我正在尝试将文件中的特定数据读入两个2D数组。第一行数据定义了每个数组的大小,所以当我填充第一个数组时,我需要跳过该行。跳过第一行后,第一个数组将填充文件中的数据,直到文件中的第7行。第二个数组填充了文件中的其余数据。

这是我的数据文件的标记图像: enter image description here

到目前为止,这是我的(有缺陷的)代码:

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

感谢大家的投入。

3 个答案:

答案 0 :(得分:3)

你的while循环迭代到文件结尾,你不需要它们。

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

改为使用(不含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.

将其应用于经济席位。


此外,您可能希望将数组更改为向量,因为可变大小的数组是地狱。

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

您需要#include <vector>使用向量,它们的访问权限与数组相同。

答案 1 :(得分:2)

您需要更改for循环的顺序并从文件中读取:

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

我会留下检查EOF并处理无效输入给读者。

答案 2 :(得分:1)

您正在阅读seat,然后使用此值填充数组。然后你再次读入seat,并用这个新值填充整个数组。

试试这个:

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.
}

您的第二个循环应使用economyClass而不是firstClass

像这样切换循环的原因是错误处理,当循环在出错时退出。或者你可以保留for循环,在内部循环中使用infile >> seat,但是如果读取失败,你必须打破两个循环。