0

ファイルからデータを取得し、それを指定された構造体と構造体の配列に入力してからファイルを出力するのに苦労しています。次のような 96 行を含むファイルが与えられます。

Arzin、Neil
2.3 6.0 5.0 6.7 7.8 5.6 8.9 7.6
Babbage、Charles
2.3 5.6 6.5 7.6 8.7 7.8 5.4 4.5

このファイルは 24 人の異なる人について続き、異なるスコアで繰り返されます (2 行目)。最初の数値、この場合は両方の人で 2.3 が難易度です。次の 6 つの数字はスコアです。

構造体と配列、およびコードを設定するために、次のデータが与えられます。

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <cmath>
using namespace std;
int main ()
{

  ifstream inFile;
  inFile.open("C://diveData.txt");

  // checking to see if file opens correctly
  if (!inFile)
  {
      cout << "Error opening the file!" << endl;
  }

  const int numRounds = 2;              // variable to hold the number of rounds
  const int numScores = 7;              // variable to hold the number of rounds
  const int numDivers = 24;             // variable to hold the number of divers
  typedef double DifficultyList[numRounds];   // 1D array for storing difficulty                of dives on each round 
  typedef double ScoreTable [numRounds] [numScores]; // 2D array of dive scores

// struct to store information for one diver
  struct DiverRecord
{
   string name;
   double totalScore;
  double diveTotal;
  DifficultyList diff;
  ScoreTable scores;
};

DiverRecord DiverList[numDivers];

// my attempt at printing out the contents of the file
  while (!EOF)
 {
    for (int x = 0; x < 25; x++)
    { 
       infile >> DiverList[x].name;
       inFile >> DiverList[x].totalScore;
       inFile >> DiverList[x].diveTotal;

       cout << DiverList.[x].name << endl;
       cout << DiverList.[x].totalScore << endl;
       cout << DiverList.[x].diveTotal << endl;
    }
  }

return 0;
}
4

3 に答える 3

0

まず、 >> 演算子は最初の空白文字で入力を終了するため、名前を読み取ると、姓とコンマのみが取得され、名が totalScore に入れられます。フルネームを取得するには、次のようにします。

  string temp;
  infile >> DiverList[x].name; 
  infile >> temp;
  DiverList[x].name + " ";
  DiverList[x].name + temp;

また、出力時に余分な「.」は必要ありません。

  cout << DiverList[x].name << endl;

などは問題なく動作するはずです。

于 2013-04-16T17:33:45.917 に答える
0

以前のコメントで述べたように、構造体と構造体の配列を使用しないことに集中しようとしており、ファイルからデータを読み取るために他の関数を使用しようとしています。次のような論理形式でデータを配置したい:

人の名前 ラウンド 1: 難易度スコア ラウンド 2: 難易度スコア

しかし、ファイルから特定の要素にアクセスするのに問題があります。

私が使用しているコードは次のとおりです。

while(inFile)
{
   string name;
   getline(inFile, name);
   cout << name << endl;
}

これにより、データ ファイルがそのまま出力されますが、難易度と 7 つのスコアに対して異なる変数を宣言しようとすると、まったく正しく出力されません。

于 2013-04-17T16:14:04.533 に答える
0

いくつかの質問:

  1. ifstreamが開いているかどうかを判断するには、を使用しifstream::is_openます。
  2. が発生するかどうかを判断するend of fileには、以下のコードを試してください。
  3. 正しく理解できれば、入力ファイルの形式は次のようになります。

    name1,name2
    難易度 スコア1 スコア2 ... スコア7

    この意味で、totalScoreはストリームから入力するのではなく、代わりに計算する必要があります。

  4. 1 つのレコードに 2 つの名前があるため、レコード構造の定義があいまいに見えます。

改訂版は次のとおりです。

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

struct DiverRecord
{
    string a, b;
    double totalScore;
    double difficulty;
    double scores[7];
};

int main ()
{

    ifstream inFile("C://diveData.txt");

    // checking to see if file opens correctly
    if (!inFile.is_open()) {
        cout << "Error opening the file!" << endl;
    }

    vector<DiverRecord> DiverList;

    DiverRecord record;
    char ch;
    while (inFile) {
        inFile >> record.a >> ch >> record.b >> record.difficulty;
        record.totalScore = 0;
        for (int i = 0; i < 7; ++i) {
            inFile >> record.scores[i];
            record.totalScore += record.scores[i];
        }

        DiverList.push_back(record);
    }

    // output your DiverList here.

    return 0;
}
于 2013-04-16T17:29:36.587 に答える