簡體   English   中英

istreambuf_iterator與結構

[英]istreambuf_iterator with structs

我很難讓istreambuf_iterator與char以外的其他類型一起使用。 我們都知道您可以將流轉換成這樣的范圍:

istreambuf_iterator<char>(ifstream("some_file")) //now we have an iterator that reads chars each step.

我有結構的二進制流,而不是字符。 所以我需要能夠做到這一點:

istreambuf_iterator<MyStruct>(ifstream("some_file"))

我想輕松地迭代流中的所有MyStruct。 由於ifstream是一個istream,它是basic_istream<char> ,僅與istreambuf_iterator<char> ,而不與istreambuf_iterator<MyStruct>一起使用,所以我無法使用istreambuf_iterator<MyStruct>

我已經編寫了自己的迭代器,但是我想使用STD迭代器,因為它看起來很完美。 他們為什么做這樣的事情? 為什么我不能使用istreambuf_iterator遍歷ifstream中的結構?

編輯:

人們建議將istream_iterator與運算符>>的自定義實現一起使用。 這將起作用,但是對於我的特定用途,我需要讀取特定數量的MyStruct,直到EOF為止。 該流包含5個MyStruct,然后包含不應視為MyStructs的更多數據。 因此,我需要通過抵消“ begin-iterator”來為范圍創建“ end-iterator”:

auto begin = istream_iterator<MyStruct>(the_istream);
auto end = istream_iterator<MyStruct>(the_istream) + 5;

但這我不知道是否可能。

擁有一個具有所有這些功能的完全標准的STL迭代器將是很好的,而且如果對標准迭代器進行更多的考慮,它們似乎可以輕松涵蓋所有這些用例。 我猜最簡單快捷的解決方案是繼續使用我的自定義迭代器。

ifstreambasic_ifstream<char>的typedef。 由於您使用的流的類型好像包含char ,因此僅對char進行迭代就不足為奇了。 您可能會想嘗試一下(我做到了):

istreambuf_iterator<MyStruct>(basic_ifstream<MyStruct>("some_file"))

但這是行不通的,因為它需要MyStructchar_traits類,而char_traits反過來又需要定義一個int_type ,在這種情況下,該int_type將是一個保存MyStruct的整數。 大概MyStruct不能以任何整數類型存儲,因此我們很不走運。

我假設您已經知道可以重載operator>>(istream&, MyStruct&) ....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM