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;
}
}
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. –
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 " –