再论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看到了换行符,然后就直接返回了。