Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从cin读入结构数组时终止输入 我是C++初学者。我正在尝试编写一个简单的程序来创建student\u info的记录。我创建了一个structs数组,其中包含成员变量名称和家庭作业分数向量。我想从终端输入cin读入这个结构数组。请在下面找到我的尝试。我所困惑的是如何在运行程序时终止/退出程序中的读取循环。我需要继续读我的名字和一系列的家庭作业成绩,形成一个单一的记录。如果我删除is.clear(),那么当我输入下一个学生的名字时,程序将退出,它只会得到一条记录_C++_Arrays_Struct_Cin - Fatal编程技术网

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

从cin读入结构数组时终止输入 我是C++初学者。我正在尝试编写一个简单的程序来创建student\u info的记录。我创建了一个structs数组,其中包含成员变量名称和家庭作业分数向量。我想从终端输入cin读入这个结构数组。请在下面找到我的尝试。我所困惑的是如何在运行程序时终止/退出程序中的读取循环。我需要继续读我的名字和一系列的家庭作业成绩,形成一个单一的记录。如果我删除is.clear(),那么当我输入下一个学生的名字时,程序将退出,它只会得到一条记录,c++,arrays,struct,cin,C++,Arrays,Struct,Cin,如有任何建议,我将不胜感激 #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&

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

#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;
  }

名称后接一系列家庭作业分数,每个分数用“返回”键输入。家庭作业的分数也不是固定的。

如果你没有阅读
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;
}

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

如果无法读取
名称
,则应通过返回来修复此问题:

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;
}

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

您需要一些实际的逻辑来确定记录何时完成。例如,如果格式是在一行中输入记录中的所有值,则应使用
std::getline
,然后使用
std::istringstream
从字符串中读取。如果所有值都在单独的行上,并用空行分隔,
std::getline
在这种情况下也会有帮助。如果某个成绩有一个结束记录的哨兵值(如
-1
),请确保您正在处理该值。否则,您可能需要一次读取一个字符,如果该字符看起来不像数字,请将其放回原处。谢谢您的评论。这是一个简化版的代码,在C++中加速,我没有改变任何结构细节的代码。我看不出他们在使用任何特殊检查来确定记录何时完成。我是否可以说分配一个字符或一个输入,例如cmd+D,以表示记录已完成。如果您在问题中包含一个示例,显示输入的确切内容,则会有所帮助。@ghoo删除您的答案,您确保评论中的有用讨论对OP不可见。我正要回复,我的评论与您的答案基本相同,但将返回类型保留为
istream&
,而不是更改为
bool
。感谢您的评论。你能给我发一封回复信,上面写着做这件事的代码吗。我需要能够按ctr+D终止所有记录的输入。我还提供了一个示例输入。非常感谢您的帮助您需要一些实际的逻辑来确定记录何时完成。例如,如果格式是在一行中输入记录中的所有值,则应使用
std::getline
,然后使用
std::istringstream
从字符串中读取。如果所有值都在单独的行上,并用空行分隔,
std::getline
在这种情况下也会有帮助。如果某个成绩有一个结束记录的哨兵值(如
-1
),请确保您正在处理该值。否则,您可能需要一次读取一个字符,如果该字符看起来不像数字,请将其放回原处。谢谢您的评论。这是一个简化版的代码,在C++中加速,我没有改变任何结构细节的代码。我看不出他们在使用任何特殊检查来确定记录何时完成。我是否可以说分配一个字符或一个输入,例如cmd+D,以表示记录已完成。如果您在问题中包含一个示例,显示输入的确切内容,则会有所帮助。@ghoo删除您的答案,您确保评论中的有用讨论对OP不可见。我正要回复,我的评论与您的答案基本相同,但将返回类型保留为
istream&
,而不是更改为
bool
。感谢您的评论。你能给我发一封回复信,上面写着做这件事的代码吗。我需要能够按ctr+D终止所有记录的输入。我还提供了一个示例输入。非常感谢你的帮助