2016-11-30 12 views
0

私は現在、初心者のC++コースの課題を抱えています。この章は構造体に関するものです。私はビジュアルスタジオを使用していますので、ダイナミックアレイ(つまりベクトルなどはありません)には何もできません。visual studioC++構造体の配列サイズが長すぎます

私が問題を抱えている部分は、ファイルの最後にスペースを入れてファイルを読み込むことです。 filename.eof()を使用しているので、空白を読み込んでそのデータを記録しています。私はcin.ignore(xxxxx、 '\ n')をやってみましたが、うまくいきませんでした。私の現在のアウトプットは、私が欲しいデータですが、ごみの行です。ゴミを取り除くにはどうすればいいですか?

a)データを配列に読み込む関数。 soccer-1.txtという添付ファイルを使用してコードをテストすることができます。また、コードが入力データファイルで動作する必要があることは言うまでもありません。もちろん、テストのためにファイルを使用して、テスト中にデータを入力しないようにしてください。データファイルの名前は、必ずユーザーが入力する必要があります(ファイル名をハードコードしないでください)。また、指定された入力データファイルが存在することを確認してください。ファイルが存在しない場合は、無効なファイル名についてユーザーに警告するエラーメッセージを発行します。ユーザーに別のファイルの名前を再度尋ねてください。ただし、ユーザーが間違ったファイル名を入力した後は、合計3回プログラムを終了してください。注:データファイル名は関数内で入力できます。

テキストファイルは次のようになります。ここで 「

Duckey E Donald forward 8 2 21 
Goof B Goofy defense 12 0 82 
Brave A Balto goalkeeper 0 0 5 
Snow W White defense 1 2 3 
Alice I Wonderful midfield 1 5 15 
Samina S Akthar right_defense 1 2 7 
Simba P Green left_back 7 3 28 
**************WHITESPACE**************************** 
**************WHITESPACE**************************** 

が私のコードです:

#include "stdafx.h" 
#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

const int subSize = 100; 

//struct to store nameInfo 
struct nameInfo 
{ 
    string fName; 
    char middleInitial; 
    string lName; 
}; 


//struct to store playerInfo 
struct playerInfo 
{ 
    nameInfo name; 

    string postion; 

    int goals; 
    int penalties; 
    int jersey; 
}; 

int getData(playerInfo matrix[]); 
void displayData(playerInfo matrix[], int arraySize); 

int main() 
{ 

    playerInfo p; 
    playerInfo playerArray[subSize]; 
    int arraySize; 
    int userSelection; 
    string searchTerm; 


    arraySize = getData(playerArray); 

    cout << arraySize << " records found." << endl << endl; 



    displayData(playerArray, arraySize); //call to display all data 
    cout << endl; 

    return 0; 
} 

//function to read the data into the array 
int getData(playerInfo matrix[]) 
{ 
    ifstream infile; 

    string fileName; 
    int i = 0;   //counter to hold array row length 
    int k = 0;   //counter for file input 
    int x = 0;   //counter for user input 


    cout << "Enter the file name (e.g. soccer-1.txt): "; 
    getline(cin, fileName); 
    cout << endl; 

    infile.open(fileName.c_str()); 

    //checks if file exists 
    //ask the user again for the name of another file 
    //loop returns -1 after 3 failed attempts to enter a file 
    while (!infile) 
    { 
     k++; 

     cout << "After attempt " << k 
      << " input file not opened." << endl; 

     cout << "Attempt " << k + 1 << ", enter the file name (e.g. soccer.txt): "; 
     getline(cin, fileName); 
     cout << endl; 

     infile.open(fileName.c_str()); 


     cout << endl; 
     if (k == 2) //terminate program at 2 because entered validation loop 
     {   //after first attempt 
      cout << "Terminating program."; 
      return -1; 
     } 
    } 

    while (!infile.eof()) 
    { 
     infile >> matrix[i].name.fName >> matrix[i].name.middleInitial 
      >> matrix[i].name.lName >> matrix[i].postion 
      >> matrix[i].goals >> matrix[i].penalties 
      >> matrix[i].jersey; 

     i++; //holds size of array 

    } 

    infile.close(); 
    return i; 

} 


void displayData(playerInfo matrix[], int arraySize) 
{ 
    for (int y = 0; y < arraySize; y++) 
    { 
     //display format: 
     //Duckey.(E)Donald:8 2 21 – forward 
     cout << matrix[y].name.fName 
      << ".(" << matrix[y].name.middleInitial << ")" 
      << matrix[y].name.lName << ":" << matrix[y].goals << " " 
      << matrix[y].penalties << " " << matrix[y].jersey 
      << " - " << matrix[y].postion << endl; 
    } 

} 
+0

Visual Studioで 'std :: vector'を使うことができるはずです。結局、' std :: string'と 'std :: cout'を使っています!あなたの教師からの制限でない限り、 'std :: vector'が生の配列よりも優れているという経験則があります。 –

+0

一般的な良い習慣では、コメントの代わりに説明的な変数名を使用します。例えば、 'int playerArraySize;'は 'int iよりもはっきりしています。 // player array size' –

答えて

0

OK、これは、変更を適用することができる場所です。

while (!infile.eof()) { 
    infile >> matrix[i].name.fName >> matrix[i].name.middleInitial >> 
     matrix[i].name.lName >> matrix[i].postion >> matrix[i].goals >> 
     matrix[i].penalties >> matrix[i].jersey; 

    i++; // holds size of array 
} 

コンテナにまっすぐではなく、文字列、または文字列に読み込みます。有効(すなわち空白ではありません)。matrixコンテナにコピーしてください。