2016-09-10 4 views
0
struct Student_info { 
std::string name; 
double midterm,final; 
std::vector<double> homework; 
}; 

私は、上記の構造体を使用して個々の学生を定義するAccelerated C++のC++プログラムを作成しています。目標は、複数の生徒の成績を保存して計算することです。プログラムは、名前、2つのテストスコア、そしていくつかの未知数の宿題を入力して標準入力から入力する必要があります。これらの値はすべて構造体にロードされ、構造体はStudent_infoのベクトルに追加されます。これを行うためのコードは以下の通りです。Cinは入力を誤って保持する

int main(){ 
    std::vector<Student_info> students; 
    Student_info record; 
    std::string::size_type maxlen = 0; 

    while(read(std::cin,record)){ 
    maxlen = std::max(maxlen,record.name.size()); 
    students.push_back(record); 
    } 
} 

std::istream& read(std::istream& is, Student_info& student){ 
    std::cout << "Enter your name, midterm, and final grade: "; 
    is >> student.name >> student.midterm >> student.final; 
    std::cout << student.name << " "<< student.midterm << " " << student.final; 
    read_hw(is,student.homework); 
    return is; 
} 

std::istream& read_hw(std::istream& in,std::vector<double>& hw){ 
    if(in){ 
    hw.clear(); 
    double x; 
    while(in>>x){ 
     hw.push_back(x); 
    } 
    in.clear(); 
    in.ignore(std::numeric_limits<std::streamsize>::max()); 
    } 
    return in; 
} 

ただし、入力が正しく読み取れません。

Sam 90 88 90 88 89 \eof Jack 86 84 85 80 82 \eof 

の入力は与える:

student.name = Sam 
student.midterm = 90. 
student.final = 88. 
student.homework = [90,88,89] 

student.name = \eof 
student.midterm = 0 
student.final = 88 
student.homework 

読み取りが失敗し、whileループが終了し、ジャックは、ベクターに追加されることは決してありませんので、この最後の生徒が構造体に適合していません。

答えて

1

read_hwあなたはストリームが閉じられるまでhomeworkと読んでいます。

最初の\eof charは標準入力を良好に閉じます。

=>閉じた入力ストリームから他の生徒を入力することはできません。

homeworkの入力を終了するには、空の行などの別の方法を見つける必要があります。

+2

私は「学生」についての質問に答えたので、下落を期待していました。それはいつも悪い幸運です:) –

関連する問題