这是作业,我已经开发了大部分作业。 我只是不断得到一个奇怪的故障。在下面的输入文件中,我应该取名称和数字,并将它们分为6个不同的变量。将数字转换为字符串,将数字转换为数组,将最后两个数字转换为整数。
当我运行我的程序并想要获取任何字符串的第十个数字时,它会向我提供下一个例如。想要在爱丽丝的成绩中获得94分。
这是文件,这里是代码,请帮忙。
#include <iostream>
#include<string>
#include <fstream>
#include <sstream>
using namespace std;
//all of a students info is stored here
struct Student {
string name;
int asgn[9];
int quiz[9];
int lab[9];
int midterm;
int final;
};
Student s[22];
int main(){
string str;
ifstream in;
in.open("C:/CS161Grades.txt");
for (int i = 0; i < 22; i++){
getline(in, str);
stringstream ss(str);
ss >> s[i].name >> s[i].asgn[0] >> s[i].asgn[1] >> s[i].asgn[2] >> s[i].asgn[3] >> s[i].asgn[4] >> s[i].asgn[5] >> s[i].asgn[6] >> s[i].asgn[7] >> s[i].asgn[8] >> s[i].asgn[9]
>> s[i].quiz[0] >> s[i].quiz[1] >> s[i].quiz[2] >> s[i].quiz[3] >> s[i].quiz[4] >> s[i].quiz[5] >> s[i].quiz[6] >> s[i].quiz[7] >> s[i].quiz[8] >> s[i].quiz[9]
>> s[i].lab[0] >> s[i].lab[1] >> s[i].lab[2] >> s[i].lab[3] >> s[i].lab[4] >> s[i].lab[5] >> s[i].lab[6] >> s[i].lab[7] >> s[i].lab[8] >> s[i].lab[9]
>> s[i].midterm
>> s[i].final;
cout << s[2].name << s[2].lab[9] << endl;
}
//pause and stop
getchar();
getchar();
return 0;
}
该文件的格式为二十名学生
Name Assignments Quizzes Labs MidT Final
Alice 71 97 64 30 99 54 8 88 92 94 15 55 91 37 71 1 5 52 37 46 6 19 17 68 7 97 36 31 33 10 72 46
答案 0 :(得分:0)
1 - 不仅int asgn[9];
数组而且int quiz[9];
和int lab[9];
数组只能包含9个元素。但是你试图为每个数组读取10。尝试用以下代码替换你的结构:
struct Student {
string name;
int asgn[10];
int quiz[10];
int lab[10];
int midterm;
int final;
};
或者如果您希望列表大小灵活,可以使用std :: vector。
2 - 您发布的文本文件片段似乎在第一行有标题。因此,您可能需要先读取它们,然后使用while循环从第二行开始读取数据。这比for
循环更灵活,因为稍后您可能需要阅读更多学生数据。使用for
循环,您将不得不修改循环边界,而使用while
循环则不需要:
getline(in, str); // str has the titles if you need them
...
while (getline(in, str)) // Now you are reading the data line by line
{
// Your code to process str goes here
}
答案 1 :(得分:0)
下面:
int asgn[9];
九个号码(asgn[0]
到asgn[8]
)的空间足够了,但您正试图将十个存储在其中。您对asgn[9]
的赋值写入数组的末尾,这是未定义的行为。
答案 2 :(得分:0)
好的,所以我修复了你的代码,基本上问题是你对数组的大小和它被索引的事实感到困惑。每个数组有10个元素,因此您需要将表声明为int arr[10]
而不是9.但是当您引用它时,arr [9]是第10个元素。得到它了? :)
我为这条糟糕的线路实现了一个快捷方式,它甚至可以更干净但我不想过多地编写你的代码并让你自己思考它。
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
using namespace std;
#define AR_SIZE 10
//all of a students info is stored here
struct Student {
string name;
int asgn[AR_SIZE];
int quiz[AR_SIZE];
int lab[AR_SIZE];
int midterm;
int final;
};
Student s[22];
void fill_array(int *arr, stringstream &ss) {
for (int idx = 0; idx < AR_SIZE; idx++) {
ss >> arr[idx];
cout << arr[idx] << " ";
}
cout << "\n";
}
int main(){
string str;
ifstream in;
in.open("test.txt");
for (int i = 0; getline(in, str); i++) {
stringstream ss(str);
ss >> s[i].name;
fill_array(s[i].asgn, ss);
fill_array(s[i].quiz, ss);
fill_array(s[i].lab, ss);
ss >> s[i].midterm >> s[i].final;
cout << s[2].name << s[2].lab[9] << endl;
}
//pause and stop
getchar();
getchar();
return 0;
}