【问题标题】:ifstream position in c++c++中的ifstream位置
【发布时间】:2009-10-23 04:49:31
【问题描述】:

我正在尝试为我的作业编写一个简单的 UTF-8 解码器。我对 C++ 还很陌生,所以请耐心等待...

我必须确定编码是否有效,并在任何一种情况下都以十六进制输出 UTF-8 字符的值。假设我已经读取了第一个字节并使用这个第一个字节来确定这个 UTF8 字符中的字节数。问题是,在我读取第一个字节后,我无法将 ifstream 位置设置回一个字节并读取整个 UTF-8 字符。我试过 seekg() 和 putback(),但我总是得到 BUS 错误或一些不是我的测试数据的奇怪输出。请帮忙,谢谢。

尽管我可以对第一个字节使用 peek(),但我仍然必须读取以下字节以确定编码是否有效。放回流位置的问题依然存在。

【问题讨论】:

  • 发布一小段代码来演示您遇到的错误可能会有所帮助。

标签: c++ fstream


【解决方案1】:

我建议你使用 peek() 来读取第一个字节。 seekg() 应该可以回退,但是 BUS 错误通常是由您的代码破坏对齐问题引起的,这表明您在代码中做了其他邪恶的事情。

【讨论】:

    【解决方案2】:

    为什么一定要回头?在知道您还期待多少个八位位组之后,您不能简单地阅读 UTF-8 序列的其余部分吗?

    【讨论】:

    • 我必须以十六进制值输出整个字符。
    • 好的,所以你已经得到了第一个字节。阅读其余部分,然后全部输出。我不明白你为什么需要回头。
    【解决方案3】:

    我会直接读取下一个字节并将其添加到我得到的内容中。正如阿特斯戈拉尔所说。恕我直言,它更干净。

    无论如何,您可以使用seekg() 移动流指针:

    char byte = 0;
    unsigned  int character = 0; // on every usage
    ifstream file("test.txt", ios::binary);
    
    file.get(byte);
    ......
    file.seekg(-1, ios::cur); // cur == current position
    file.get(
        reinterpret_cast<char*>(&character),
        numberOfBytesAndNullTerminator);
    
    cout << hex << character;
    

    请注意,在第二种情况下,get()character 的末尾写入'\0'。所以你必须给它所需的字节数,包括空终止符。所以,如果你想读取两个字节==&gt; numberOfBytesAndNullTerminator = 3

    【讨论】:

      【解决方案4】:

      我不知道你为什么需要把字符放回去,但 istream::unget() 或 istream::putback() 应该做你想做的事。在编译器的文档中查找它们。

      【讨论】:

        【解决方案5】:

        请查收:

        ifstream::seekg()
        ifstream::teellg()
        

        【讨论】:

          猜你喜欢
          • 2012-06-20
          • 1970-01-01
          • 2010-10-09
          • 2012-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多