十年前,我曾經是一名C++專家,但在過去的10年中,我一直在編寫Java。我剛開始使用小型第三方XML解析器的C++項目。 XML解析器接受STL istream。我的XML數據來自Windows COM IStream。我認爲我會做正確的事情,並創建一個適配器來接收IStream數據,並通過istream將其呈現給XML解析器。如何爲自定義istream/streambuf實現seekg()?
我按照http://www.mr-edd.co.uk/blog/beginners_guide_streambuf的優秀教程創建了一個COMStreambuf,它從底層COM IStream獲取數據,並將其用作自定義COMIstream的緩衝區。一切看起來不錯,但我從解析器中得到一個讀取錯誤。
原來,解析器通過在istream上使用seekg()來查找其大小,然後用seekg()一次性讀取它,從而將整個文件讀入內存。不出所料,上述教程決定「保存另一篇文章的[實施求職指導]」,這顯然從未寫過。
有人能告訴我我需要做什麼來實現seekg()與我的自定義istream/streambuf?我會冒昧地自己做(我的第一個傾向是重寫istream中的東西),但是由於我在STL中缺乏深入的經驗,並且憑藉我的Java心態,我擔心我會做一些不完整的事情並且有一個脆弱的解決方案。 (例如,在沒有閱讀教程的情況下,例如,我從來不會想到通過編寫新的streambuf來創建自定義istream,或者我需要使用默認語言環境調用imbue()等)。
謝謝你的幫助。我對這個網站印象非常深刻 - 既有參與者的知識,又有友善,誠實的性格,承認誰擁有最好的答案。 :)
什麼是'gback()'?你的意思是'eback()'? – 0x499602D2 2014-01-20 19:29:49
@ 0x499602D2:是的。感謝您發現這一點。 – 2014-01-22 14:01:44