C++终止cin输入while循环时多读取^Z或^D的问题

原代码:

istream& operator>>(istream& is, map&mm)
{
	string ss="";
	int ii=0;
	is >> ss>>ii;
    mm[ss]=ii;
    return is;
}

int main()
{
    mapmsi;

    while(cin>>msi);

    return 0;
}

问题:

当用^Z终止while(cin>>msi)时,^Z会被读入ss,msi会被插入msi[ss]=0; 

原因:

^Z被当作string读入,当再次输入^Z时,while循环才会被终止;

解决方案:

如果ii没有被写入新值,则不插入一新map元素,此时,读入ss的^Z会随着离开局部作用域而销毁。如下:

istream& operator>>(istream& is, map&mm)
{
	string ss="";
	int ii=0;
	is >> ss;
	if(is>>ii)mm[ss] = ii;
    return is;
}

解决思路:

1.查看控制台输出,得知^Z被当作string读入;

2.试图通过监控流的状态来防止^Z被读入。例如当读取到流末尾的时候,停止读入。但是^Z依然被当作流末尾。故该措施无效;

3.查看>>操作符,想到既然只有ss被赋值,ii没有被赋值,故而可以以ii是否被赋值为条件,来决定是否插入新的map元素。

你可能感兴趣的:(C++错误总结,c++,错误总结)