为什么我在文件数据之前收到这些无效字符?

时间:2015-06-08 23:19:48

标签: c++ string file fstream readfile

enter image description here

我试图通过getline函数或fileContents.assign( (istreambuf_iterator<char>(myFile)), (istreambuf_iterator<char>()));将文件读入字符串 这两种方式都给了我上面的输出,如图所示。

第一种方式:

 string fileContents;
 ifstream myFile("textFile.txt");
 while(getline(myFile,fileContents))
 cout<<fileContents<<endl;

替代方式:

 string fileContents;
 ifstream myFile(fileName.c_str());
 if (myFile.is_open())
  {
    fileContents.assign( (istreambuf_iterator<char>(myFile) ),
                       (istreambuf_iterator<char>()    ) );
    cout<<fileContents;
  }

2 个答案:

答案 0 :(得分:1)

文件以这些字符开头,很可能是BOM来告诉你文件的编码是什么。

您可能无法在Windows记事本中看到它们,因为记事本会隐藏编码字节。获得一个体面的文本编辑器,让你看到文件的二进制文件,你会看到这些字符。

答案 1 :(得分:0)

您的文件以UTF-8 BOM(字节0xEF 0xBB 0xBF)开头。您正在按原样读取文件的原始字节,并将它们输出到使用codepage 437的OEM字体的显示器。要正确处理文本文件,尤其是Unicode编码的文本文件,您需要读取前几个字节,检查BOM(并且有several you can look for),如果检测到,则查找过去的BOM并解释剩余的字节指定编码中的文件,在本例中为UTF-8。