我正在尝试为我的作业编写一个简单的UTF-8解码器。我对C ++很新,所以请耐心等待......
我必须确定编码是否有效,并在任何一种情况下以十六进制输出UTF-8字符的值。假设我已经读取了第一个字节,并使用第一个字节来确定此UTF8字符中的字节数。问题是,在我读完第一个字节后,我无法将ifstream位置设置回一个字节并读取整个UTF-8字符。我已经尝试过seekg()和putback(),但我总是得到BUS错误或一些奇怪的输出,这不是我的测试数据。请帮忙,谢谢。
即使我可以使用peek()作为第一个字节,但我仍然必须读取以下字节以确定编码是否有效。设置回流位置的问题仍然存在。
答案 0 :(得分:2)
我建议您使用peek()来读取第一个字节。 seekg()应该可以倒带,但是BUS错误通常是由你的代码破坏对齐问题引起的,这会导致你在代码中做了其他不好的事情。
答案 1 :(得分:2)
你为什么要回去?在知道你期望多少个八位字节之后,难道你不能简单地阅读其余的UTF-8序列吗?
答案 2 :(得分:1)
我会直接阅读下一个字节并将其添加到我得到的内容中。正如Ates Goral所说。它更清洁恕我直言。
无论如何,您可以使用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
。
答案 3 :(得分:0)
我不知道为什么你需要把角色放回来,但istream :: unget()或istream :: putback()应该做你想要的。在编译器的文档中查找它们。
答案 4 :(得分:-1)
ifstream::seekg()
ifstream::teellg()