0

我有一个看起来像这样的文本文件:

Azrin, 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 个不同的名称。名字在第一行,数字在文件的第二行。第一个数字是潜水的难度级别,后面的7个数字是7位不同评委给出的分数。

我已经能够读取潜水员的姓名和难度级别,但它不会读取难度级别之后的分数。

我已经尝试了几乎所有我能想到的让它正常工作,有人可以帮忙吗?

到目前为止,我将数据读入结构的代码如下所示

const int NUM_NAMES = 24;
const int NUM_SCORES = 7;
const int NUM_ROUNDS = 2;


typedef double scoreTable[NUM_ROUNDS] [NUM_SCORES];
typedef double difficultyList[NUM_ROUNDS];

struct diveInfo
{
string diversName;
double totalScore;
double diveTotal;
difficultyList diff;
scoreTable scores;

};


typedef diveInfo diverList[NUM_NAMES];


int main()
{
diveInfo record;
diveInfo * ptr;
ptr = &record;
int lcv;

ifstream inFile;
inFile.open ("diveData.txt");

if (!inFile)
{
    cout << "ERROR: File could not be opened" << endl << endl;

    exit (EXIT_FAILURE);
}


for (lcv = 0; lcv < NUM_NAMES; lcv++)

getline(inFile, ptr[lcv].diversName);

delete ptr;
ptr = new diveInfo;

inFile >> *ptr[lcv].diff;

delete ptr;
ptr = new diveInfo[NUM_SCORES];

inFile >> *ptr[lcv].scores;   // here is the problem 

return (EXIT_SUCCESS);
}
4

3 回答 3

4

您的代码非常混乱。我想一开始很简单,但是当它不起作用时,它变得越来越复杂。但这很容易,你不需要任何复杂的东西。第一件事是您不需要指针,也不需要new

让我们从头开始,你的结构是错误的,在你做对之前你什么也做不了。想想你的数据,你有一个名字、一个难度分数和七个评委分数。把它放在一个结构中

struct DiveInfo
{
    string diversName;
    double diff;
    double scores[7];
};

现在我们有 24 种不同的潜水,所以我们需要一个包含 24 个 DiveInfo 结构的数组

DiveInfo diveList[24];

现在我们可以开始阅读了,记住不要使用指针,不要使用new。这个简单不复杂。

for (int i = 0; i < 24; ++i)
{
    getline(inFile, diveList[i].diversName);
    inFile >> diveList[i].diff;
    for (int j = 0; j < 7; ++j)
        inFile >> diveList[i].score[j];
    string garbage;
    getline(inFile, garbage); // move to next line, ready to read next name
}

看?每次循环我们都会读取一个 DiveInfo(文件中的两行)。每个 DiveInfo 是一个名称,后跟难度分数,然后是 7 位评委分数。唯一稍微复杂的是最后的getline(..., garbage);一点。当您阅读最后一个分数时,有必要将输入移动到下一行。

于 2013-04-23T19:20:02.757 回答
0

尝试改变

 typedef double scoreTable[NUM_ROUNDS] [NUM_SCORES];

 typedef double scoreTable[NUM_SCORES];

您没有在程序中使用数组的第二维,并且数据文件似乎也没有使用它。

另外,您为什么要在阅读每个项目后删除您创建的数据结构?如果您想要一个潜水信息对象数组,您应该创建它,然后为您要读取的每条记录迭代它。在每条记录中,您将需要遍历每个乐谱,分别阅读它们。

这应该让您朝着正确的方向前进:

diveInfo theDiveInfo[40]; // This array of diveInfo will hold all of the information for 40 divers

for(int i = 0; i < NUM_RECORD; ++i)
{
  getline(inFile, theDiveInfo[i].diversName);

  for(int j = 0; j < NUM_SCORES; ++j)
    inFile >> theDiveInfo[i].scores[j];
}
于 2013-04-23T19:20:57.250 回答
-1

您正在使用像 C 一样的 C++。创建类而不是结构会更容易、更清晰。

您应该创建一个可以处理您的文件的 Parser 类和一个可以存储名称、难度和分数数组的 Person 类。

这样,您的解析器可以创建 Person 实例并将它们存储在容器中。

此外,您可以使用 STL 来存储您的数据。

如果您需要更多解释,请告诉我。

问候,

于 2013-04-23T19:14:48.857 回答