我的问题:
我是新手编程并尝试用C ++编写程序,我有一个文本文件。 *在文本文件中存储的是学生姓名,成绩和成绩单。我想将它们存储为数组*
中的不同类型我想将它们单独存储在数组中.... 即文本文件如下所示:
Jill Hamming A 96
Steven Jenning A 94
Tim Sutton B 89
Dillon Crass C 76
Sammy Salsa D 54
Karen Poulk D 49
我想将所有名字存储在一个数组中,将姓氏存储在另一个数组中等等。依此类推。 稍后将这些数组分配给学生的对象。最多可能有500名学生。
所以问题是:
如何将文本文档中的输入存储到数组中,而不是使用500个变量。
即。这是我的尝试。
int main()
{
/// the input is all different types, strings, ints and chars
string my_First_Name[500], my_Last_Name[500];
int my_grade[500];
char my_letter[500];
ifstream myfile("input.txt");
if (myfile.is_open()){
for (int i = 0; i < 500; i++) {
myfile >> my_First_Name[i] >> my_Last_Name[i] >> my_grade[i] >> my_letter[i];
}
// much later and irrelevent part but just showing because this is what I want to do. where Student Class exsists somewhere else. yet to be programmed.
Student myStudent [500];
myStudent[i].Grades = my_grade[i];
myStudent[i].LetterGrade = my_letter[i];
}
myfile.close();
//Exit
system("pause");
return 0;
}
当我打印出我所拥有的东西时。我有所有负面和奇怪的数字,这意味着它没有初始化。我哪里出错了?
答案 0 :(得分:0)
当你有多个相同大小的数组时,它通常是设计不佳的标志。
经验法则是拥有由类或结构表示的记录(或数据行):
struct Record
{
string first_name;
string last_name;
int grade_value; // Can this go negative?
string grade_text;
};
如果你知道你将拥有500,你可以为数据创建一个数组:
#define ARRAY_CAPACITY (500)
Record grades[ARRAY_CAPACITY];
这不是一个很好的解决方案,因为如果少于500则浪费空间,如果读取超过500则执行缓冲区溢出。
因此,更好的解决方案是使用std::vector
,它允许您在阅读时附加记录。 std::vector
将根据需要进行扩展以包含记录。使用数组,您必须分配一个新数组,将旧记录复制到新数组,然后删除旧数组。
此外,一个好的解决方案将包括Record
内的方法,以从输入流中读取数据成员。研究&#34;重载流提取操作符&#34;。
您输入的循环应该类似于:
Record r;
while (input_file >> r)
{
student_grades.push_back(r);
}
您可以通过搜索stackoverflow找到此信息。一个好的开始搜索是&#34; stackoverflow c ++读取文件空间分离&#34;或者&#34;以逗号分隔&#34;或&#34; stackoverflow c ++读取文件结构&#34;。
阅读记录
您可以将循环扩展为以下内容:
std::vector<Record> student_grades;
Record r;
while (input >> r.first_name >> r.last_name >> r.grade_value >> r.grade_text)
{
student_grades.push_back(r);
}
如果您过敏或仅限阵列,则需要使用带阵列的计数器。
#define MAXIMUM_RECORDS (500)
Record r;
Record grade_book[MAXIMUM_RECORDS];
unsigned int record_count = 0U;
while (input >> r.first_name >> r.last_name >> r.grade_value >> r.grade_text)
{
grade_book[record_count] = r;
++record_count;
if (record_count >= MAXIMUM_RECORDS)
{
break;
}
}
未使用for
循环,因为我们不知道文件中有多少条记录,只是程序读取的最大记录数。如果文件有600条记录,则只读取500条记录。