c++中cin.ignore()的问题如何解决
cin.ignore();
getline(cin, employee.name);
怎么解释?不是已经ignore到换行了吗,怎么还能在本行取字符串?
我哪里理解错了 展开
参考Bjarne Stroustrup 《C++程序设计语言》:
ignore()函数像read()一样读字符,但它并不将读入的字符存到任何地方。它也像read()一样能实际读n个字符(而不是n - 1个)。由ignore()读入的字符的个数默认为1,所以不用参数调用ignore()就意味着“丢掉下一个字符”。ignore()也可以用一个结束符(像getline()一样),在读入中遇到这个结束符时,就将它从输入流中删除。注意,ignore()的默认结束符是文件结束。
所以,你应该写
std::cin.ignore(80, '\n');
最多读入80个字符,或其间遇到'\n'就停止,'\n'会被删除。
所谓“删除”的意思可以比较std::cin.get和std::cin.getline,还是用书上的例子:
void subtle_infinite_loop()
{
char buf[256];
while (cin) {
cin.get(buf, 256);
cout << buf;
}
}
std::cin.get和std::cin.getline一样,默认是以'\n'为结束标志(其实这两个函数都是两个版本,是函数重载,一个是两个参数的,一个是三个参数的),上面的get如果在读入256之前遇到'\n',流中的'\n'不会被“删除”,下一次你读入的时候会遇到的第一个字符就是终结符'\n',它不是指从文件里面删除掉这个字符。而std::cin.getline和std::cin.ignore又有相同之处,就是在读入指定的字符前遇到终结符就会把终结符“删除”掉,所以下一次读入时就不会遇到终结符了。还有,所谓std::cin.get或std::cin.getline读入n-1个字符是,std::cin.get和std::cin.getline会实际读入指定数的字符少一个,因为它会在buf读入的字符后面加上'\0',但是read不会在buf后加上'\0'。
广告 您可能关注的内容 |