如何从C ++文本文件的开头删除字符“”?

时间:2013-12-26 03:58:12

标签: c++ byte

我正在尝试读取文本文件,对于每个单词,我会将它们放入二叉搜索树的节点中。但是,第一个字符总是被读作“+第一个字”。例如,如果我的第一个单词是“This”,那么插入我的节点的第一个单词是“This”。我一直在寻找解决方案来解决这个问题,有一篇文章在Java中提出同样的问题,但没有人用C ++解决过这个问题。有人帮我解决了吗?谢谢。

我找到了一个简单的解决方案。我在记事本中打开文件,并将其保存为ANSI。之后,文件正在读取并正确传递到二叉搜索树

3 个答案:

答案 0 :(得分:16)

这是UTF-8的BOM

您需要将文件读为UTF-8。如果您不需要Unicode并且只使用前127个ASCII码点,则将文件保存为ASCII或UTF-8而不用BOM

答案 1 :(得分:4)

这是Byte Order Mark (BOM)。它是ISO-8859-1 中 UTF-8 BOM的表示。您必须告诉编辑不要使用BOM或使用其他编辑器去除它们。

在C ++中,您可以使用以下函数将UTF-8 BOM文件转换为ANSI

void change_encoding_from_UTF8BOM_to_ANSI(const char* filename)
{
    ifstream infile;
    string strLine="";
    string strResult="";
    infile.open(filename);
    if (infile)
    {
        // the first 3 bytes (ef bb bf) is UTF-8 header flags
        // all the others are single byte ASCII code.
        // should delete these 3 when output
        getline(infile, strLine);
        strResult += strLine.substr(3)+"\n";

        while(!infile.eof())
        {
            getline(infile, strLine);
            strResult += strLine+"\n";
        }
    }
    infile.close();

    char* changeTemp=new char[strResult.length()];
    strcpy(changeTemp, strResult.c_str());
    char* changeResult = change_encoding_from_UTF8_to_ANSI(changeTemp);
    strResult=changeResult;

    ofstream outfile;
    outfile.open(filename);
    outfile.write(strResult.c_str(),strResult.length());
    outfile.flush();
    outfile.close();
}

答案 2 :(得分:0)

在调试模式下查找特殊字符的符号,然后替换

content.replaceAll("\uFEFF", "");