当输入为EOF时std::cin.get(c)如何设置对应char参数的值?
std::cin.get(char&)遇到EOF时的行为说明
首先给出明确结论:当输入流遇到EOF时,std::cin.get(char& ch) 不会修改传入的ch变量的值,也不会主动将其赋值为\0。
根据C++标准对basic_istream<charT,traits>& get(char_type& c)的行为定义,该函数的执行逻辑如下:
- 调用时首先检查输入流状态,如果流本身已经处于错误状态,会直接置位
failbit,不对ch做任何修改 - 如果流状态正常,尝试读取下一个可用字符:
- 读取成功:将读取到的字符值写入ch,流状态保持正常,返回流自身的引用
- 遇到EOF:同时置位流的
eofbit和failbit,不对ch做任何写入操作,ch会保留调用该函数前的初始值
注意:不要通过判断ch的值是否为特殊值来确认是否读到EOF,这是常见的逻辑误区。正确的EOF判断方式是直接检查流的状态,因为函数的返回值就是输入流的引用,可直接用于布尔判断,示例代码如下:
char ch; if (std::cin.get(ch)) { // 读取成功,ch为读到的合法字符,可正常处理 } else { // 读取失败,大概率遇到EOF,此时ch的值没有参考意义 }
你倾向于使用std::cin.get(ch)而非ch = std::cin.get()的写法是更安全的选择:后者返回int类型,取值范围包含unsigned char的所有合法值和独立的EOF标识(通常为-1),如果直接赋值给char变量,当char为无符号类型时,-1会被转换为255,和0xff字符的取值完全一致,无法区分是读到了合法字符还是EOF,极易引发逻辑错误。
内容的提问来源于stack exchange,提问作者Itachi Uchiwa
相关产品推荐
相关产品推荐

