使用文件流处理unget和putback

时间:2013-07-21 20:50:19

标签: c++ c c++11 stream locale

我在std::basic_streambuf周围实现了std::basic_filebuf派生包装器,它在编码之间进行转换。在这个包装器中,我使用单个缓冲区来输入和输出。缓冲技术来自this文章。

现在,我无法弄清楚的问题是这个。调用underflow时,我的内部缓冲区已填满。根据文章,当从输入切换到输出时,缓冲区应处于不稳定状态。为此,我需要unget缓冲区中的未读数据。阅读文档和源代码,ungetputback无法保证成功。这将使我在下一个输入操作时使用无效的tellg指针。

我不是要求有人为我写这个,但是我正在询问如何以一种不会失败的方式管理来自std::basic_filebuf的未获取数据的建议。

我认为,唯一可靠的方法是计算将写入文件的字节并相应地调整偏移量。它并不像听起来那么简单。 filebuf可能有一个关联的locale,在编译时未知。我尝试获取facet并通过它的out成员传递数据,但它不起作用。以前读取的数据可能具有非默认mbstate_t值,而某些codecvt对象也会写入BOM。

基本上,在通过codecvt之后计算文件数据部分的“文件”长度几乎是不可能的。

我用'c'标记了这个问题,因为'c'文件流也可以使用缓冲区,也可以使用get和put指针。 std::basic_filebuf只是'c'文件流的包装器。 'c'中的答案也适用于此问题。

有人对如何在文件流上实现无限制的unget有任何建议吗?

0 个答案:

没有答案