0

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

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

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

4

5 回答 5

2

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

于 2009-10-23T04:52:28.870 回答
2

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

于 2009-10-23T04:54:22.457 回答
1

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

无论如何,您可以使用以下方法移动流指针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()在第二种情况下,写'\0'character. 所以你必须给它所需的字节数,包括空终止符。所以,如果你想读取两个字节==> numberOfBytesAndNullTerminator = 3

于 2009-10-23T05:16:22.787 回答
0

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

于 2009-10-23T05:18:34.603 回答
-1

请查收:

ifstream::seekg()
ifstream::teellg()
于 2009-10-23T05:27:51.357 回答