将文件中的数据输出到结构的结构和数组中

时间:2013-04-16 16:53:52

标签: c++ visual-c++

我在从文件中获取数据并将其输入到给定的结构和结构数组然后输出文件时遇到了很多麻烦。我们给出了一个包含96行的文件,如下所示:

  

Arzin,Neil
  2.3 6.0 5.0 6.7 7.8 5.6 8.9 7.6
  巴贝奇,查尔斯   2.3 5.6 6.5 7.6 8.7 7.8 5.4 4.5

此文件将继续针对24个不同的人,然后以不同的分数重复(第二行)。 第一个数字,在这种情况下是两个人的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;
}

3 个答案:

答案 0 :(得分:0)

几个问题:

  1. 决定ifstream是否开启,请使用ifstream::is_open;
  2. 决定是否遇到end of file,请尝试以下代码;
  3. 如果我做对了,你的输入文件格式应为:

      

    1,名称2
      难度得分1得分2 ...得分7

    从这个意义上讲,totalScore不应该从流中输入,而是计算出来。

  4. 一条记录有两个名称,因此记录结构的定义似乎很模糊。
  5. 以下是修订版:

    #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;
    }
    

答案 1 :(得分:0)

首先是&gt;&gt;运算符在第一个空白字符处结束输入,因此当您在名称中读取时,您只获得姓氏和逗号,它将尝试将第一个名称放入totalScore中。要获得全名,请执行以下操作。

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

此外,在输出时,您不需要额外的'。'

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

等应该可以正常工作。

答案 2 :(得分:0)

正如我在之前的评论中所说,我现在正集中精力不使用结构体和结构数组,并尝试使用其他函数来从文件中读取数据。我想将数据放在逻辑形式中,例如:

人名 第1轮:难度分数 第二轮:难度分数

但我无法从文件中访问特定元素。

我使用的代码是:

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

这会按原样输出数据文件,但是当我尝试为难度和七个分数声明不同的变量时,它根本无法正确输出。