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'
。所以你必须给它所需的字节数,包括空终止符。所以,如果你想读取两个字节==> numberOfBytesAndNullTerminator = 3
。
【讨论】:
【参考方案4】:我不知道你为什么需要把字符放回去,但 istream::unget() 或 istream::putback() 应该做你想做的事。在编译器的文档中查找它们。
【讨论】:
【参考方案5】:请查收:
ifstream::seekg()
ifstream::teellg()
【讨论】:
以上是关于c++中的ifstream位置的主要内容,如果未能解决你的问题,请参考以下文章
c++ 从具有相同循环的 ifstream 或 stringstream 中读取
C++中,ifstream和ofstream定义文件流的区别