CodeWalk

istream的get/getline/read操作符差异与输入缓冲区

作者:编译有声 · 2026-05-30 12:55

请对比 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 用于二进制数据。