我有一个看起来像的文本文件:
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);
}
答案 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存储数据。
告诉我你是否需要更多解释。
此致