从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终止所有记录的输入。我还提供了一个示例输入。非常感谢你的帮助