ifstream 运算符>> 和 get() 方法有什么区别?



最近,我在读取二进制文件时使用了>>运算符,但在某些情况下,它只会跳过一个字节。查找代码中的错误给我带来了很多问题,但最终我用get()方法解决了这个问题,但我仍然不知道为什么>>会不时跳过字节。

目标是将文件中的第一个字节加载到m_Value中,即uint8_t

>>:的代码

bool CByte :: load ( ifstream & fin)
{
if(! ( fin >> m_Value ) ) return false;
return true;
} 

get():的代码

bool CByte :: load ( ifstream & fin)
{
char c = 0;
if(! ( fin . get ( c ) ) ) return false;
m_Value = static_cast <uint8_t> (c);
return true;
}

operator>>是一个格式化的输入函数,get()是一个未格式化的输入功能。

重要的区别在于,格式化的输入在提取之前会跳过空白1,并且会解析数据。它的目的是从流中提取文本或数字,而不是读取二进制数据。


1除非另有明确配置,否则使用std::noskipws