从 cin 读入结构数组时终止输入
Terminating input when reading into struct array from cin
我是 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
姓名后跟一系列作业成绩,每个作业成绩均使用 'return' 键输入。作业的分数也不固定
这应该可以通过在您阅读失败时返回来解决 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;
}
修复挂起的原因是当您未能读取字符串时,流仍处于错误状态。以前,您总是在返回之前清除状态。
我是 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
姓名后跟一系列作业成绩,每个作业成绩均使用 'return' 键输入。作业的分数也不固定
这应该可以通过在您阅读失败时返回来解决 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;
}
修复挂起的原因是当您未能读取字符串时,流仍处于错误状态。以前,您总是在返回之前清除状态。