std :: ifstream开头的字符是什么?

问题描述:

我打开一个文本文件:std :: ifstream开头的字符是什么?

std::ifstream in("1.txt"); 

if(in.good()) 
{ 
    char ch = 0; 

    while(!in.eof()) 
    { 
     in >> ch; 

     std::cout << std::hex << (short)ch << " "; 
    } 
} 

而且我一开始接收三个奇怪的字符:FFEF FFBB FFBF。它是什么?

+1

请阅读[为什么使用eof不好](http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) –

它看起来像一个BOM标记。 BOM标记在那里要注意你的数据是UTF-8。请注意0​​处理像ASCII这样的东西。

最好在这里小心:因为你正在像ASCII一样处理它,当你遇到一个奇怪的字符时可能会出错。

有关BOM标记的更多详细信息,请参阅https://en.wikipedia.org/wiki/Byte_order_mark

+1

好spotting。我唯一的困惑是为什么OP说这些字节没有出现在他们的十六进制编辑器中。除非它像我在工作中不得不使用的可怕的Perforce diff工具那样默默地忽略物料清单。 – paddy

+1

@paddy请注意,他实际上也会将“char”投射到“short”。文件中的数据可能只是BOM标记;额外的'ff's就在那里,因为'char'是有符号的,并且投射会做符号扩展。例如。 0xEF将变为0xFF 0xEF [etc] – atlaste