私は現在、初心者の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;
}
}
Visual Studioで 'std :: vector'を使うことができるはずです。結局、' std :: string'と 'std :: cout'を使っています!あなたの教師からの制限でない限り、 'std :: vector'が生の配列よりも優れているという経験則があります。 –
一般的な良い習慣では、コメントの代わりに説明的な変数名を使用します。例えば、 'int playerArraySize;'は 'int iよりもはっきりしています。 // player array size' –