c++中的ifstream位置

Posted

技术标签:

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

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

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

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

【问题讨论】:

发布一小段代码来演示您遇到的错误可能会有所帮助。 【参考方案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()

【讨论】:

以上是关于c++中的ifstream位置的主要内容,如果未能解决你的问题,请参考以下文章

c++ 从具有相同循环的 ifstream 或 stringstream 中读取

C++中,ifstream和ofstream定义文件流的区别

C++ ifstreamofstream ifstream 读取并输出文件中的string

如何检查ifstream是不是是C ++中的文件结尾

为啥 c++ ifstream 不能从设备读取?

c++ 为啥 ifstream get() 函数返回无法识别的特殊字符?