代码之家  ›  专栏  ›  技术社区  ›  Inertial Ignorance

C++-我在使用fin吗。忽略()错误?

  •  1
  • Inertial Ignorance  · 技术社区  · 6 年前

    我有一个。我想读入的名为“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;
    

    这将不会打印任何内容,因为BOM正在执行某些操作。

    所以,我决定使用鳍。函数,以忽略文件的起始BOM字符。然而,仍然没有打印任何内容。这是我的完整程序:

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <istream>
    
    using namespace std;
    
    int main()
    {
    ifstream fin("1.txt");
    
    if (fin.fail())
    {
        cout << "Fail\n";
    }
    
    else
    {
        string temp = ""; // Will hold 1.txt's contents.
    
        fin.ignore(10, ' ');
        // Ignore first 10 chars of the file or stop at the first space char,
        // since the BOM at the beginning is causing problems for fin to read the file.
        // BOM is 8 chars, I wrote 10 to just be safe.
    
        char c = fin.get();
    
        while (!fin.eof())
        {
            if (c >= ' ' && c <= 'z') // checks if c stores a standard char.
            {
                temp += c;
            }
    
            c = fin.get();
        }
    
        cout << temp;
    
        // PROBLEM:  No text is printed to the screen from the above command.
    
        cout << temp.size(); // prints 0
    }
    }
    

    我假设在:ifstream fin(“1.txt”);行,现在已经太晚了,因为BOM可能会影响fin。所以我需要告诉fin在读取文件之前忽略BOM字符,但我不能使用fin。ignore(),因为我还没有声明fin对象。

    此外,我知道我可以手动删除我的BOM表。txt文件,但我正在寻找一种只需要编写C++程序的解决方案。如果我有成千上万的。txt文件,手动删除不是一个选项。另外,我不想下载新软件,比如记事本++

    ?你好!

    这个网站的格式不允许我显示,但在实际的文件中,BOM表和Hello之间大约有15个空格!

    1 回复  |  直到 6 年前
        1
  •  2
  •   chris    6 年前

    根据 cppreference ,值为x1a的字符以文本模式终止Windows上的输入。你大概在一开始就有这样一个角色。我的空。doc文件有一个作为第7字节。

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

    std::ifstream fin("1.txt", std::ios::binary);
    

    你仍然可以使用 ignore 忽略前缀。然而,直到一个特定的角色出现时,它才被忽略。二进制前缀可以包含该字符。如果这些前缀的长度始终相同,则忽略特定数量的字节后缀。此外,您不能依靠查看记事本中的文件来计算字节数。有很多看不见的角色。您应该查看文件的十六进制视图。许多优秀的文本编辑器都可以做到这一点,或者您可以使用Powershell的 Format-Hex -Path <path> 命令例如,下面是我的前几行:

    00000000   D0 CF 11 E0 A1 B1 1A E1 00 00 00 00 00 00 00 00  ÐÏ.ࡱ.á........
    00000010   00 00 00 00 00 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  ................
    

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