if ++在c ++中的位置

时间:2009-10-23 04:49:32

标签: c++ fstream

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

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

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

5 个答案:

答案 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()