C++ C++;-我是否错误地使用了fin.ignore()?

C++ C++;-我是否错误地使用了fin.ignore()?,c++,file,file-io,ifstream,byte-order-mark,C++,File,File Io,Ifstream,Byte Order Mark,我想读入一个名为“1.txt”的.txt文件。由于文件以8个BOM表字符开头,如果我执行以下操作: ifstream fin("1.txt"); string temp = ""; char c = fin.get(); while (!fin.eof()) { if (c >= ' ' && c <= 'z') { temp += c; } c = fin

我想读入一个名为“1.txt”的.txt文件。由于文件以8个BOM表字符开头,如果我执行以下操作:

ifstream fin("1.txt");

string temp = "";

char c = fin.get();

    while (!fin.eof())
    {
        if (c >= ' ' && c <= 'z')
        {
            temp += c;
        }

        c = fin.get();
    }

    cout << temp;
ifstream-fin(“1.txt”);
字符串temp=“”;
char c=fin.get();
而(!fin.eof())
{
如果(c>=''&&c根据,则值为\x1a的字符在文本模式下终止Windows上的输入。您可能在开头附近有这样一个字符。我的空.doc文件有一个作为第7字节

您应该以二进制模式读取文件:

std::ifstream fin("1.txt", std::ios::binary);
您仍然可以使用
ignore
忽略前缀。但是,在忽略特定字符之前,这是一种不稳定的忽略。二进制前缀可以包含该字符。如果这些前缀的长度始终相同,则忽略特定数量的字节后缀。此外,您不能依靠在记事本中查看文件来计算前缀的数量f字节。有很多不可见字符。您应该查看文件的十六进制视图。许多优秀的文本编辑器都可以这样做,或者您可以使用Powershell的
Format hex-Path
命令。例如,我的前几行:

00000000 D0 CF 11 E0 A1 B1 1A E1 00 00。。。。。。。。
000000 100 00 00 00 3E 00 03 00 FE FF 09 00…….>…þ。。。
00000020   06 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00  ................

现在还不清楚在没有更多信息的情况下删除前缀的最佳方法是什么。

至少我终于弄明白了这是什么。这是一个.doc文件的开始(与BOM无关)“克里斯,你知道我能在C++中去掉它吗?我看不出前面的代码< >代码有什么问题。忽略< /COD>,但是你最好确保它只看10字节。在用Word 2016创建的一个空的doc文件中,它在第一个空间之前有4106个字节,之后还有其他的东西。<代码> STD::IFSWATE不猜测编码或任何东西。我建议使用调试器逐行探索发生了什么,以缩小问题的范围。@克里斯,对不起,以前的建议是什么。忽略你在引用?来自的建议。我使用ios::binary读取文件,它工作得很好。现在我有一个大字符串,开头有一堆单词文本每个文件内容的结尾和结尾,但是修剪它们应该不是问题。我可以使用一些符号;例如,如果一个程序发现一行中没有10个可打印字符,那么该区域几乎肯定是在一个单词前缀或后缀中。然后我可以删除所有字符,直到达到一个大的空格字符,因为它们是空的分离每个文件内容的前缀、主文本和后缀。
std::ifstream fin("1.txt", std::ios::binary);