Cin держится за ввод и читает неправильно

struct Student_info {
std::string name;
double midterm,final;
std::vector<double> homework;
};

Я пишу программу на C ++ из Accelerated C ++, которая использует вышеуказанную структуру для определения отдельного студента. Цель состоит в том, чтобы хранить и рассчитывать оценки для нескольких студентов. Программа должна принимать входные данные от stdin в форме имени, двух результатов тестов, а затем некоторого неизвестного числа оценок за домашнее задание. Все эти значения загружаются в структуру, а затем структура добавляется в вектор Student_info. Код для этого ниже.

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 заканчивается, и Джек никогда не добавляется в вектор.

0

Решение

в read_hw ты читаешь homework пока поток не будет закрыт.

Первый \eof char закрывает стандартный ввод для хорошего.

=> другие студенты не могут быть введены из закрытого потока ввода.

Вы должны найти другой способ закончить homework ввод, как, например, пустая строка.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]