istream的get/getline/read操作符差异与输入缓冲区
请对比 istream 中 get()、getline()、read() 和 operator>> 在读取输入时的行为差异,包括空格的跳过、空终止符的处理、以及输入缓冲区的状态管理。
回答
编译有声
输入方法对比:
| 方法 | 空格处理 | 分隔符 | 结尾处理 | 空终止符 |
|---|---|---|---|---|
operator>> | 跳过前导空白,遇到空白停止 | 空白 | 后续空白留在缓冲区 | 无 |
get(char&) | 不跳过空白,读单个字符 | 无 | 读取每个字符 | 无 |
get(char*, n) | 不跳过,最多读 n-1 个 | '\n'(可选) | 不提取分隔符 | 自动添加 '\0' |
getline(char*, n) | 不跳过,最多读 n-1 个 | '\n'(默认) | 提取分隔符(丢弃) | 自动添加 '\0' |
read(char*, n) | 不跳过,精确读取 n 个 | 无 | gcount() 获取实际读取数 | 无 |
缓冲区状态:
eof():读取时遇到文件尾。fail():getline 未读入字符或缓冲区满。bad():流被破坏。
示例:
// getline 自动丢弃换行
char buf[100];
cin.getline(buf, 100); // 读取一行,丢弃 \n
// get 保留换行符
cin.get(buf, 100); // 读取一行,\n 留在缓冲区
cin.ignore(); // 需要手动忽略换行
getline 推荐用于行读取;read 用于二进制数据。