【问题标题】:Terminating input when reading into struct array from cin从 cin 读入结构数组时终止输入
【发布时间】:2015-09-01 03:55:29
【问题描述】:

我是 C++ 的初学者。我正在尝试编写一个简单的程序来创建student_info 的记录。我创建了一个 structs 数组,其中包含成员变量名称和作业成绩向量。我希望从终端输入cin 读入这个structs 数组。请在下面找到我的尝试。我感到困惑的是如何在运行程序时终止/退出程序中的读取循环。我需要继续阅读姓名和形成一条记录的一堆作业成绩。如果我删除is.clear(),那么它只会得到一条记录,当我输入下一个学生的名字时,程序就会退出。

如果有任何建议,我将不胜感激。

#include <cstdlib>
#include <string>
#include <iostream>
#include <vector>
using namespace std;

struct student_info{
  string name;
  vector<double> hw_grades;
};

istream& read_single_record (istream& is, student_info& s){
  is>>s.name;
  double x;
  while(is>>x)
  {
     s.hw_grades.push_back(x);
  }
  is.clear();
  return is;}

int main() {
  //read data into an array of student info
  vector<student_info> vec_st_info;
  student_info x;
  while(read_single_record(cin,x))
  {
    vec_st_info.push_back(x);
  }             
  return 0;
  }

程序的示例输入将是

John
88
98
89
67
Sam
78
90
Tom
89
90
76

名称后跟一系列作业成绩,每个成绩都用“返回”键输入。作业成绩的数量也不是固定的。

【问题讨论】:

  • 您需要一些实际的逻辑来确定记录何时完成。例如,如果格式是在一行中输入记录中的所有值,则应使用std::getline,然后使用std::istringstream 从字符串中读取。如果所有值都在单独的行上,并用空行分隔,std::getline 在这种情况下将再次提供帮助。如果有结束记录的成绩的标记值(例如-1),请确保您正在处理它。否则,您可能需要一次读取一个字符,如果字符看起来不像数字,则将其放回。
  • 感谢您的评论。这是 Accelerated C++ 中代码的简化版本,我没有更改代码的任何结构细节。我没有看到他们使用任何特殊检查来确定记录何时完成。有什么办法可以说分配一个字符或一个输入,例如cmd + D 表示记录结束
  • 如果您在问题中包含一个准确显示输入内容的示例,将会有所帮助。
  • @Ghooo 通过删除您的答案,您确保 OP 看不到 cmets 中的有用讨论。我正要回复我的 cmets 与您的答案基本相同,但将返回类型保留为 istream&amp; 而不是更改为 bool
  • 感谢您的评论。您能否发布一个回复,显示执行此操作的代码。我需要能够按 ctr+D 来终止所有记录的输入。我还包括了一个示例输入。非常感谢您的帮助

标签: c++ arrays struct cin


【解决方案1】:

当您阅读name 失败时,应该通过返回来解决这个问题:

istream& read_single_record (istream& is, student_info& s)
{
  if( !(is>>s.name) ) return is;
  double x;
  while( is>>x )
  {
     s.hw_grades.push_back(x);
  }
  is.clear();
  return is;
}

修复挂起的原因是,当您无法读取字符串时,流仍处于错误状态。以前,您总是在返回之前清除状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-31
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多