CTRL-Z
интерпретируется как «конец файла», так что любой последующий доступ к этому потоку больше не будет считываться в элементах. Единственный безопасный способ - это изменить логику программы так, чтобы список имен заканчивался, скажем, «END», а не CTRL-Z
. Затем вы можете продолжить в режиме сохранения.
Часто входные данные с терминала считываются построчно и затем анализируются. Это облегчает обработку ошибок. Смотрите следующий код, следующий за таким подходом:
#include <sstream>
int main() {
string line;
map<string,int> scoreboard;
cout << "enter name score (type END to finish):" << endl;
while (std::getline(cin, line) && line != "END") {
stringstream ss(line);
string name;
int score;
if (ss >> name >> score) {
scoreboard[name] = score;
} else {
cout << "invalid input. Type END to finish" << endl;
}
}
cout << "enter name:" << endl;
string name;
if (cin >> name) {
auto item = scoreboard.find(name);
if (item != scoreboard.end()){
cout << "score of " << name << ":" << item->second << endl;
}
else {
cout << "no entry for " << name << "." << endl;
}
}
}