2016-11-30 2 views
0

Ich mache derzeit eine Aufgabe für meine Anfänger C++ Kurs, das Kapitel ist auf Strukturen. Ich benutze Visual Studio, so dass ich nichts Besonderes für dynamische Arrays machen kann (d. H. Keine Vektoren usw.).Visual StudioC++ Array-Größe in Struct ist zu lang

Der Teil der Hausaufgaben, mit denen ich Probleme habe, liest eine Datei mit Leerzeichen am Ende der Datei. Da ich filename.eof() verwende, liest es die Leerzeichen und zeichnet diese Daten auf. Ich habe versucht, cin.ignore (xxxxx, '\ n') zu tun, aber das hat nicht funktioniert. Die aktuelle Ausgabe ist die Daten, die ich will, aber eine Reihe von Müll. Wie werde ich den Müll los?

a) Eine Funktion zum Lesen der Daten in das Array. Sie können die angehängte Datei namens soccer-1.txt verwenden, um Ihren Code zu testen. Es versteht sich von selbst, dass Ihr Code mit jeder Eingabedatei funktionieren muss. Zum Testen verwenden Sie Ihre Datei natürlich, um das Eingeben von Daten während des Testens zu vermeiden. Der Name der Datendatei muss immer vom Benutzer eingegeben werden (kodieren Sie keinen Dateinamen). Überprüfen Sie außerdem, ob die angegebene Eingabedatendatei vorhanden ist. Wenn die Datei nicht existiert, geben Sie eine Fehlermeldung aus, um den Benutzer über den ungültigen Dateinamen zu informieren. Stellen Sie sicher, dass Sie den Benutzer erneut nach dem Namen einer anderen Datei fragen. Beenden Sie das Programm jedoch, nachdem der Benutzer insgesamt 3 Mal einen falschen Dateinamen eingegeben hat. HINWEIS: Der Dateiname kann innerhalb der Funktion eingegeben werden.

Die Textdatei sieht wie folgt aus: "

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**************************** 

Hier ist mein Code:

#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

Sie sollten 'std :: vector' mit Visual Studio verwenden können - Sie verwenden schließlich' std :: string' und 'std :: cout'! Sofern es sich nicht um eine Einschränkung von Ihren Lehrern handelt, ist es eine feste Faustregel, dass ein 'std :: vector' einem rohen Array vorzuziehen ist. –

+0

Auch, allgemeine gute Praxis, verwenden Sie einen beschreibenden Variablennamen anstelle eines Kommentars. Zum Beispiel ist 'int playerArraySize;' klarer als 'int i; // Player-Array-Größe " –

Antwort

0

OK, das ist, wo Sie eine Änderung anwenden können:

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 
} 

Lesen Sie in eine Zeichenfolge oder eine Reihe von Zeichenfolgen statt direkt in den Container gültig (d.h. nicht leer) vor dem Kopieren in den Container matrix.