【问题标题】:Store Input from Text File into Arrays or Variables?将文本文件中的输入存储到数组或变量中?
【发布时间】:2016-07-01 21:06:47
【问题描述】:

我的问题:

我对编程和尝试用 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;

}

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

【问题讨论】:

  • 使用struct并将其存储在std::vector中。
  • 你说先评分然后评分字母,但你显示的文件内容却反过来。
  • 所有这些都是无关紧要的,我想知道为什么你不能像我一样将它存储在数组中。我从未使用过 std::vector。存储在向量与数组中有何帮助?
  • 数组在传递给函数时很痛苦。当你传递一个数组时,元素的容量和数量都会丢失。此外,数组是固定大小的,而std::vector 可以动态增长。
  • 文件中真的有500条记录吗?如果少于 500 会发生什么?超过 500 个时会发生什么?

标签: c++ arrays text input


【解决方案1】:

当您有多个相同大小的数组时,通常表示设计不佳。

经验法则是用一个类或结构表示一条记录(或一行数据):

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 内的方法,用于从输入流中读取数据成员。研究“重载流提取算子”。

你的输入循环应该是这样的:

Record r;
while (input_file >> r)
{
  student_grades.push_back(r);
}  

您可以通过搜索 stackoverflow 找到此信息。一个好的开始搜索是“stackoverflow c++ 读取文件空间分隔”或“逗号分隔”或“stackoverflow c++ 读取文件结构”。

阅读记录
您可以将循环扩展为如下内容:

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 条。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多