繁体   English   中英

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

[英]pointer to read data into an array of structs 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位不同裁判给出的分数。

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

为了使它正常工作,我已经尝试了几乎所有我能想到的东西,任何人都可以帮忙吗?

到目前为止,我的代码已将数据读取到struct中,如下所示

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

您的代码非常混乱。 我猜它起初很简单,但是如果不起作用,它就会变得越来越复杂。 但这很容易,您不需要任何复杂的事情。 第一件事是,您不需要指针 ,也不需要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); 最后一点。 阅读完最后一个乐谱后,将输入移至下一行很有必要。

尝试改变

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

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

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

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

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

告诉我是否需要更多说明。

问候,

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM