指向将数据读入结构数组c ++的指针

时间:2013-04-23 19:03:07

标签: c++

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

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

3 个答案:

答案 0 :(得分:4)

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

让我们从一开始就开始,你的结构是错误的,除非你得到正确的结果,否则你无法到达任何地方。想想您的数据,您有一个名字,一个难度分数和七个评委分数。把它放在结构

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

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

DiveInfo diveList[24];

现在我们可以开始做一些阅读,记住没有指针而没有。这很简单并不复杂。

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);位。当您阅读完最后一个分数时,必须将输入移动到下一行。

答案 1 :(得分:0)

尝试更改

 typedef double scoreTable[NUM_ROUNDS] [NUM_SCORES];

 typedef double scoreTable[NUM_SCORES];

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

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

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

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

答案 2 :(得分:-1)

你正在使用类似C的C ++。创建类而不是结构会更容易,也更清晰。

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

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

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

告诉我你是否需要更多解释。

此致