2011-03-10 16 views
3

私は、テキストファイルのデータで配列を塗りつぶすプログラムに取り組んでいます。私が配列を出力するとき、その内容は私がそれらを読むと思った順序ではありません。私は問題が配列にデータを入力するか、または配列をiostreamに出力するforループのいずれかであると考えています。誰も私の間違いを見つけられますか?この配列を間違って埋めるか、間違って出力していますか?

データ

(Iは0と1からそれを区別するために2-31に各行の最初の数を変更) enter image description here

出力

enter image description here

コード

#include <cstdlib> 
#include <iostream> 
#include <fstream> 
#include <iomanip> 

using namespace std; 

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

    inFile.open("Airplane.txt"); 

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

    int airplane[100][6]; 

    int CurRow = 0; 
    int CurCol = 0; 

    while ((inFile >> seat) && (CurRow < FC_Row)) 
    { 
    airplane[CurRow][CurCol] = seat; 
    ++CurCol; 
     if (CurCol == FC_Col) 
     { 
     ++CurRow; 
     CurCol = 0; 
     } 
    } 


while ((inFile >> seat) && (CurRow < EconRow)) 
{ 
airplane[CurRow][CurCol] = seat; 
++CurCol; 
    if (CurCol == EconCol) 
    { 
    ++CurRow; 
    CurCol = 0; 
    } 
} 

    cout << setw(11)<< "A" << setw(6) << "B" 
    << setw(6) << "C" << setw(6) << "D" 
    << setw(6) << "E" << setw(6) << "F" << endl; 
    cout << " " << endl; 

    cout << setw(21) << "First Class" << endl; 
    for (a = 0; a < FC_Row; a++) 
    { 
     cout << "Row " << setw(2) << a + 1; 
     for (b = 0; b < FC_Col; b++) 
     cout << setw(5) << airplane[a][b] << " "; 

     cout << endl; 
    } 

    cout << setw(23) << "Economy Class" << endl; 
    for (a = 6; a < EconRow; a++) 
    { 
     cout <<"Row " << setw(2)<< a + 1; 
     for (b = 0; b < EconCol; b++) 
     cout << setw(5) << airplane[a][b] << " "; 

     cout << endl; 
    } 


    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

答えて

1

これは間違っています。

for (a = 0; a < 100; a++)  
    for (b = 0; b < 6; b++) 

上記のループは、ファイルの最初の行(行ごとに6つの要素がない)とよく一致しません。

最初の内側ループでは、飛行機[0]に2, 1, 1, 1, 3, 0と表示されます。

EDIT:修正。アレイを充填

for (a = 0; a < FC_Row; a++)  
    for (b = 0; b < FC_Col; b++) 
     inFile >> airplane[a][b] ; 

for (a = 0; a < EconRow; a++)  
    for (b = 0; b < EconCol; b++) 
     inFile >> airplane[a+FC_Row][b] ; 
+0

ダンそれ、ザッツはなぜ私は当初、2つの配列を使用するが、必要条件は一つだけの配列をしたいです!どうすればこの問題を回避できますか? – darko

+0

私はあなたの前の質問でこのループについて提案した方法:P - http://stackoverflow.com/questions/5239689/reading-data-from-file-into-array - ちょうど1つの配列を使用し、CurRowをリセットしないでくださいファーストクラスを読む – Erik

+0

推奨される修正で更新されました。これは何のエラーチェックもなく、私はまだあなたの他のQからのループメカニズムが良いと思います。 – Erik

1

あなたコード:

for (a = 0; a < 100; a++)  
     for (b = 0; b < 6; b++) 
      inFile >> airplane[a][b] ; 

は、すべての行6列があることを前提とし、最初の6行にのみ4行があり、そこではありません。

0

だから、100x6の配列を塗りつぶしますが、データの最初の数行には4列のデータしかありません。

for (a = 0; a < 100; a++)  
     for (b = 0; b < 6; b++) 
     { 
      char c; 
      inFile>>c; 
      if (c is new line){ 
      break; 
      } 

      //fill in the 2d array 
     } 
0

ここで正しいアプローチはSTDで一度ラインを読み込むことです:: getlineの:

良い方法は、このようなものです。次に、2次元配列ではなくベクトルを使用することもできますが、同様に各行を解析します。

ベクトルのベクトルがある場合は、内側のベクトルがすべて同じサイズである必要はなく、実際にはそうではありません。

それでも、私はEconRowとEconColの値を読み取っていて、配列のサイズをハードコードしているとは限りません。あなたは柔軟にあなたが読んでいた値に設定することができるであろうベクターで

関連する問題