《C++编程原理与实践》输入验证:EOF处理逻辑疑问
关于《C++编程原理与实践》中输入终止逻辑的修正
以下是Stroustrup所著《C++编程原理与实践》中的相关内容:
// 某处:让ist在失效时抛出异常: ist.exceptions ( ist.exceptions() | ios_base::badbit );我们也可以指定一个字符作为终止符:
for (My_type var; ist>>var; ) { // 读取至文件结束 // 可检查var是否合法 // 对var执行操作 } if (ist.fail()) { // 使用'|'作为终止符/分隔符 ist.clear(); char ch; if (!(ist>>ch && ch=='|')) error("输入终止格式错误"); } // 继续执行:已到达文件结尾或找到终止符若我们不想接受终止符——即仅接受文件结尾作为结束标志——只需删除error()调用前的检查即可。但终止符在读取嵌套结构文件时非常实用,因此我们会保留使用终止符的可能性。
- 原文提到“若我们不想接受终止符——即仅接受文件结尾作为结束标志”,但代码中并未检查EOF?
if (!(ist>>ch && ch=='|')) error ( "输入终止格式错误" );
这段代码仅检查终止符,未检查EOF:因为EOF会使std::cin进入失败状态,导致if语句触发error。此时非法输入(如'@')和EOF的效果相同,都会让流进入失败状态。正确的写法应加入EOF判断:
if (!( (ist >> ch && ch=='|') || ist.eof() ) ) error("输入终止格式错误");
修改后的代码会在遇到EOF或终止符时不触发error,仅在非法输入(如非整数)时触发。
内容的提问来源于stack exchange,提问作者Maestro
相关产品推荐
相关产品推荐

