我在十年前是一名C++专家,但过去十年我一直在编写Java程序。我刚刚开始一个使用小型第三方XML解析器的C++项目。XML解析器接受STL istream。我的XML数据来自Windows COM IStream。我想我应该做正确的事情,创建一个适配器,将IStream数据取出并通过istream呈现给XML解析器。
我遵循了http://www.mr-edd.co.uk/blog/beginners_guide_streambuf上的优秀教程,创建了一个COMStreambuf,它从基础COM IStream获取数据,并将其用作自定义COMIstream的缓冲区。一切看起来都很好,但是我从解析器处获得了读取错误。
事实证明,解析器通过对istream使用seekg()来查找其大小,然后使用seekg()回到开头以一次性读取整个文件的方式读取整个文件到内存中。不出所料,上述教程决定“将[实现寻址的指令]保存到其他帖子”中,而这些帖子显然从未被写过。
有人能告诉我如何使用自定义istream/streambuf实现seekg()吗?我可能会尝试自己解决问题(我的第一反应是覆盖istream中的内容),但由于我对STL的经验不足以及我的Java思维方式,我担心我会做出不完整的解决方案。例如,没有阅读教程,我从来没有想到过通过编写新的streambuf来创建自定义istream,或者我需要使用默认语言环境调用imbue()等。
感谢任何帮助。我对这个网站印象非常深刻——参与者的知识和友好、诚实的本质都令人印象深刻。 :)
我遵循了http://www.mr-edd.co.uk/blog/beginners_guide_streambuf上的优秀教程,创建了一个COMStreambuf,它从基础COM IStream获取数据,并将其用作自定义COMIstream的缓冲区。一切看起来都很好,但是我从解析器处获得了读取错误。
事实证明,解析器通过对istream使用seekg()来查找其大小,然后使用seekg()回到开头以一次性读取整个文件的方式读取整个文件到内存中。不出所料,上述教程决定“将[实现寻址的指令]保存到其他帖子”中,而这些帖子显然从未被写过。
有人能告诉我如何使用自定义istream/streambuf实现seekg()吗?我可能会尝试自己解决问题(我的第一反应是覆盖istream中的内容),但由于我对STL的经验不足以及我的Java思维方式,我担心我会做出不完整的解决方案。例如,没有阅读教程,我从来没有想到过通过编写新的streambuf来创建自定义istream,或者我需要使用默认语言环境调用imbue()等。
感谢任何帮助。我对这个网站印象非常深刻——参与者的知识和友好、诚实的本质都令人印象深刻。 :)
gback()
是什么?你是不是想说eback()
? - David G