2016-08-04 25 views
0

このプログラムの構造体の配列に.txtファイルを読み込み、内容を表示しようとしています。
ファイルは次のようになります。struct C++の配列にファイルを読み込む

Smith Jack 60 45 98 
Harry Hisk 45 40 78 
Kay  Jacob 35.5 23 45 
Dos  hed 23 20 35 
Noa  Tom 55 12 32 
Joe  Peni 57 49 78 
Vin  San 25.6 23 65.5 
Jes  Dan 24.3 12 78 
Zi  Lee 56 49 99 
Angi  Dev 57 48 97 
Donald David 60 50 96 
Davis Lal 47 47 80 
Alvis Sen  56 46 85 
Jack Jill 45 45 75 
Messy Lionel 60 49 100 

私が実行しているコード:

#include <iostream> 
#include <string> 
#include <fstream> 
using namespace std; 
int main(){ 
    const int SIZE=50; 
    int i; 
    struct Records { 
     string firstname; 
     string secondname; 
     float test1mark; 
     float midtestmark; 
     float annualmark; 
    }record[SIZE]; 

    ifstream in("Data.txt"); 

    if (!in){ 
    cerr << "File can't be opened! " << endl; 
    system("PAUSE"); 
    exit(1); 
    } 
    for (int i=0; i < SIZE; i++){ 
    in >> record[i].firstname >> record[i].secondname 
    >>record[i].test1mark >> record[i].midtestmark >> record[i].annualmark ; 
    } 
    for (int i=0;i< SIZE;i++) { 
     cout << record[i].firstname<<" "; 
     cout << record[i].secondname<<" "; 
     cout << record[i].test1mark<<" "; 
     cout << record[i].midtestmark << " "; 
     cout << record[i].annualmark << " "; 
    } 
return 0; 
} 

私は取得しています出力:

Smith Jack 60  45  98 
Harry Hisk 45  40  78 
Kay  Jacob 35.5 23  45 
Dos  hed  23  20  35  
Noa  Tom  55  12  32 
Joe  Peni 57  49  78 
Vin  San  25.6 23  65.5 
Jes  Dan  24.3 12  78 
Zi  Lee  56  49  99 
Angi Dev  57  48  97 
Donald David 60  50  96 
Davis Lal  47  47  80 
Alvis Sen  56  46  85 
Jack Jill 45  45  75 
Messy Lionel 60  49  100 
       nan  0  8.94237e-039 
       4.36192e-039 0  -2.3511e-038 
       0  0  -2.3511e-038 
       0  0  0 
       1.32253e-038 0  1.32251e-038 
       4.2039e-045  0  -2.11122e+037 
       1.32251e-038 0  3.21276e-039 
       1.4013e-045  0  -2.3511e-038 
       1.4013e-045  0  3.76158e-037 
       0  0  3.76158e-037 
       0  0  1.12104e-044 
       4.36195e-039 0  4.36194e-039 
       3.57331e-043 0  6.0615e-039 
       0  0  3.21276e-039 
       4.2039e-045  0  6.41272e-039 
       1.12104e-044 0  6.63812e-039 
       4.36205e-039 0  -2.75237e+038 
       0  0  6.59812e-039 
       6.63426e-039 0  1.4013e-045 
       0  0  6.47961e-039 
       3.21319e-039 0  3.21319e-039 
       6.59812e-039 0  3.21299e-039 
       8.40779e-045 2.24208e-044 6.01433e-039 
       6.6045e-039  0  2.54408e-029 
       0  0  6.6045e-039 
       0  0  6.43946e-039 
       5.88656e-039 0  -4.12495e+011 
       0  0  0 
       5.88656e-039 0  2.54408e-029 
       nan  nan  6.43029e-039 
       0  0  0 
       5.93823e-039 0  -4.12495e+011 
       0  0  0 
       5.93823e-039 0  5.74532e-044 
       nan  nan  5.93837e-039 

プロセスは0.05447後に終了しました返り値0の秒数
プレス続けるための鍵。 。 。

誰かに間違っていることを教えてもらえますか?私はポインタを使用してみましたが、それはちょうど悪化しました。 -Beginner

+0

'で

int i; 

は、(i = 0をint型;私はSIZEを<;私は++)ことを必要としないと考えている{' - どのようにあなたが読むべき50のデータ項目があることを知っていますか? – PaulMcKenzie

+0

@PaulMcKenzieそれは課題の質問ですが、その必要条件です。 –

+0

私はあなたのクラスにいませんので、私は一般的に答えることができます。あなたが数えれば、あなたは50個のアイテムを持っていないので、あなたのループは15番目のアイテムの後にガベージデータを読み込みます。とにかくこのような "読み込みループ"は書いていません。ファイルの終わりまで、またはあらかじめ設定された制限に達するまで、あなたがループするはずです*どちらか早い方*。あなたのために、eofが最初に来たが、あなたは繰り返していた。 – PaulMcKenzie

答えて

1

ファイルには15行があり、15行のデータしか読み取ることができません。読み込む行数を制御するには、変数SIZEを使用しています。

SIZE50です。 ではなく、15です。ファイルの最後を読み取ろうとすると、でなく、の入力は16 番目の行を超えて読み取られます。したがって、インデックス15の後の変数は、未初期化されます。は未定義ですです。

ファイル内の行数を50に増やすか、SIZE15に変更してください。

+0

ありがとう!それは私がしなければならなかったすべてでした:) –

+0

EOFが設定されているストリームから抽出するのはUBではありません。単に入力が行われません。 UBは初期化されていないデータをcoutに挿入します。 –

+0

@DavidThomas完全に真実です:)ありがとう – Rakete1111

0

@ Rackete1111の別の回答では、指定したアイテムが多すぎるため、データを読み取るループがファイル内の実際のアイテム数を超えています。

このように言えば、実際には、ループを正しく書き込む限り、あなたが持つレコードの数を誇張して間違っていることはありません。以下では、50項目の代わりに15を明記の「間違い」を作っていても、ループを記述するための方法である:我々は限界まで読みますwhileループを持って

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

using namespace std; 

int main(){ 
    const int SIZE=50; 
    int i; 
    struct Records { 
     string firstname; 
     string secondname; 
     float test1mark; 
     float midtestmark; 
     float annualmark; 
    }; 

    Records record[SIZE]; 

    ifstream in("Data.txt"); 

    int recCount = 0; // keep track of actual number of records 

    // loop until we reach the end of file, or until we hit SIZE records, 
    // whichever comes first 
    while (!in.eof() && recCount < SIZE) 
    { 
     in >> record[recCount].firstname >> record[recCount].secondname 
     >>record[recCount].test1mark >> record[recCount].midtestmark >> record[recCount].annualmark ; 
     ++recCount; 
    } 

    // now recCount == 15 if you have 15 items. 

Live Example

注意(50)に達するか、ファイルの終わりに達する。

+0

しかし[while(!eof ...)は間違っていると考えられます](http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-考えて間違っている)@PaulMcKenzie –

-1

と私は、我々がために始め

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



ifstream in("Data.txt"); 
const int SIZE = 15; 
void debugPrint(); 
void loadData(); 

struct Records { 
    string firstname; 
    string secondname; 
    float test1mark; 
    float midtestmark; 
    float annualmark; 
}record[SIZE]; 

int main() 
    { 
    loadData(); 
    debugPrint(); 
    } 

void debugPrint() 
{ 
    for (int i = 0; i < SIZE; i++) 
    { 
     cout << record[i].firstname << " "; 
     cout << record[i].secondname << " "; 
     cout << record[i].test1mark << " "; 
     cout << record[i].midtestmark << " "; 
     cout << record[i].annualmark << " " <<endl;   
    } 
    system("PAUSE"); 
} 

void loadData() 
{ 
    for (int i = 0; i < SIZE; i++) 
    { 
     if (!in) 
     {            
      cerr << "File can't be opened! " << endl; 
      system("PAUSE"); 
     } 

     in >> record[i].firstname >> record[i].secondname 
     >> record[i].test1mark >> record[i].midtestmark >> record[i].annualmark; 
    } 
} 
関連する問題