将文本文件中的输入存储到数组或变量中?

时间:2016-07-01 21:06:47

标签: c++ arrays text input

  

我的问题:

我是新手编程并尝试用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;

}

当我打印出我所拥有的东西时。我有所有负面和奇怪的数字,这意味着它没有初始化。我哪里出错了?

1 个答案:

答案 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条记录。