• 再论cin 与getline


          很多书上,都很笼统的说,cin用于提取输入缓冲区的字符,且自动转换赋给接收的变量(如char 、int 、double等类型),以空白字符(blank、\n ,\t)作为分隔提取,getline用于提取整行数据,以换行符作为分隔。

         具体的说,cin在开始提取的时候,会跳过所有空白字符(blank,\n,\t),直到第一个非空白字符才开始提取,对于提取字符串(string类型)而言,然后就会一直提取直到遇到空白字符,结束提取。此时,空白字符不会被丢弃,仍然留在输入缓冲区内;对于其他类型(如int),则会一直提取到不属于该类型的字符截止。如果遇到类型错误,cin就会置failbit位为有效位1,然后返回。如果遇到文件结尾,就置eofbit位为有效位1,遇到I/O错误,就置badbit位为有效位1。上述三者可以重合。

        getline会直接提取,不做开始的检查,直到看到换行符(\n),然后停止提取,并且,将换行符从输入缓冲区中丢弃,这样,下一次提取就是换行符之后的数据。

        因此,当程序混合使用cin,getline读取数据时,特别是字符串,就要特别注意。

        比如假设cin读取字符串,看到换行符结束提取,然后又用getline提取时,就会得到一个空行,failbit位就会被置为有效位,就是因为getline看到了换行符,然后就直接返回了。

  • 相关阅读:
    如何处理大数据量抽数长期无响应
    处理链报错邮件通知
    BW数据源深入研究【转自WKingChen的博客】
    BW:处理链报错解决步骤
    创建自己的Convers. Routine.
    vs2005 创建 C++ Dll项目
    C++之模板
    delphi 的 pos 函数 对中文支持不好。
    delphi中 socket 心跳包的实现
    C++ UTF8编码转换 CChineseCode
  • 原文地址:https://www.cnblogs.com/easyFancy/p/3002243.html
Copyright © 2020-2023  润新知