問題タブ [istream-iterator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - istream_iteratorを使用してコピーする
この場合、コンソールから文字列入力を取得するときのソースの終わりは何でしょうか?
c++ - `std::istreambuf_iterator`の使用法について混乱しています
<<
ストリーム演算子を使用して、オブジェクトの逆シリアル化ルーチンを実装しました。ルーチン自体はistreambuf_iterator<char>
、オブジェクトを構築するために、を使用してストリームから文字を1つずつ抽出します。
最終的に、私の目標は、を使用してストリームを反復処理し、istream_iterator<MyObject>
各オブジェクトをに挿入できるようにすることvector
です。ストリームの終わりに達したときに反復istream_iterator
を停止するのに問題があることを除いて、かなり標準的です。今のところistream::tellg()
、ファイルの最後にいることを示す呼び出しがあったとしても、それは永遠にループします。
問題を再現するためのコードは次のとおりです。
この些細な例では、istreambuf_iteratorも必要ないことはわかっていますが、問題を単純化しようとしているだけなので、人々が私の質問に答える可能性が高くなります。
したがって、ここでの問題はistreambuf_iterator
、がストリームバッファの最後に到達しても、実際のストリーム自体が状態にならないことEOF
です。ファイルの最後のバイトを返し、trueと比較しistream::eof()
てもfalseを返すように呼び出します。これは、私が間違いなくストリームの最後にいることを意味します。istream::tellg()
istreambuf_iterator<char>(ifs)
istreambuf_iterator<char>()
istream_iterator
IOstreamsライブラリコードを調べて、が終了位置にあるかどうかを正確に判断する方法を確認しました。基本的には、にistream::operator void*() const
評価されるかどうかを確認しtrue
ます。このistreamライブラリ関数は単に以下を返します。
0
つまり、フェイルビットが設定されている場合は(false)を返します。次に、この値をのデフォルトで構築されたインスタンスの同じ値と比較istream_iterator
して、最後にいるかどうかを判断します。
そのため、比較が真と終了イテレータを比較std::istream& operator >> (std::istream& is, Foo& f)
するときに、ルーチンでフェイルビットを手動で設定してみました。istreambuf_iterator
これは完全に機能し、ループを適切に終了しました。しかし今、私は本当に混乱しています。「ストリームの終わり」の状態を示すために、istream_iterator
間違いなくチェックしているようです。std::ios::failbit
しかし、それは何std::ios::eofbit
のためではありませんか?failbit
たとえば、の基になるファイルをfstream
開くことができなかった場合など、エラー状態のためだと思いました。
では、なぜistream::setstate(std::ios::failbit)
ループを終了させるために呼び出す必要があるのでしょうか。
c++ - 1 つのファイルに 2 つの istream_iterator を定義できますか?
1 つのファイルを指す 2 つの入力ストリーム イテレータを使用できますか? 上記の場合のように、イテレータが進んでおり (逆参照は 1 回だけ)、最初の要素 (文字列) がコピーにありません。可能な方法はありますか?
c++ - std::istream_iterator<> と copy_n() およびその仲間
以下のスニペットは、から 3 つの整数を読み取りますstd::cin
。2 を書き込みnumbers
、3 番目を破棄します。
コードが から正確に 2 つの整数を読み取ることを期待してstd::cin
いましたが、これは標準に準拠した正しい動作であることがわかりました。これは標準の見落としですか?この行動の根拠は何ですか?
C++03 標準の 24.5.1/1 から:
構築後、++ が使用されるたびに、反復子は の値を読み取って格納します
T
。
したがって、上記のコードでは、呼び出し時点でストリーム イテレータが既に 1 つの整数を読み取っています。その時点以降、アルゴリズムの反復子によるすべての読み取りは先読みであり、前の読み取りからキャッシュされた値が生成されます。
次の標準であるn3225の最新のドラフトは、ここで何の変更も受けていないようです (24.6.1/1)。
関連する注意事項として、コンストラクターに関する現在の標準の 24.5.1.1/2 はistream_iterator(istream_type& s)
読み取ります
効果: で初期化
in_stream
しs
ます。value
構築中または最初に参照されたときに初期化される場合があります。
「初期化する必要がある」とは対照的に、「初期化されるvalue
可能性があります...」に重点を置いています。これは 24.5.1/1 と矛盾しているように聞こえますが、それ自体が疑問に値するかもしれません。
c++ - std::istream_iteratorを使用してstd::copyの範囲を制限する
STLイテレーターを使用して発生した問題を示すために、最小限の作業例を作成しました。私は:からs(または他のタイプ)istream_iterator
を読み取るために使用しています:floats
std::istream
floats
これは、EOFが固定サイズの4になるまで、すべての可能なsを読み取りますvalues
。したがって、オーバーフローを回避するために範囲を制限し、正確に/最大4つの値を読み取りたいと思います。
より多くの「通常の」イテレータ(つまり、RandomAccessIterator)を使用するbegin+4
と、次のように終了しません。
正確に4つの要素を読み取るため。
これをどのように行うのstd::istream_iterator
ですか?明らかなアイデアは、呼び出しを次のように変更するstd::copy
ことです。
しかし(かなり予想通り)これはコンパイルされません。次の候補はありませんoperator+
。
助言がありますか?これを達成するための正しい「STLified」pre-C++0xの方法はありますか?もちろん、forループとして書き出すこともできますが、ここでSTLについて何かを学びたいと思っています。std::transform
どういうわけかこの機能を実現するために悪用などについて半ば疑問に思ってstd::merge
いましたが、その方法がよくわかりません。
c++ - std::ostream_iterator でブースト IOStream を使用する
std::ostream_iterator
配列デバイス ベースのストリームと wantet を使用してストリームをorに渡そうとしましたstd::istream_iterator
が、残念ながら gcc 4.3.5 でコンパイル エラーが発生します。
Boost::IOStreams のドキュメントには、が基になるデバイス カテゴリに依存するか、またはその両方 ( )から派生io::stream
していると記載されています。配列 device にはシーク可能なカテゴリがあるため、 io::stream がorから派生し、互換性があることを期待しています。しかし、残念ながらコンパイルエラーが発生します。std::basic_istream
std::basic_ostream
std::basic_iostream
std::basic_iostream
std::ostream_iterator
std::istream_iterator
コード スニペットは次のとおりです。
そして、最後の行で次のようなエラーが発生します。
c++ - ユーザーがポリシーテンプレートパラメータを指定しないようにする
私は、入力ストリームから単語を抽出するように設計された一種のistream_iterator
(それを呼ぶ)設計をしています。my_istream_iterator
イテレータから抽出された単語が処理される方法は、単語がストリームで区切られる方法とは無関係ですが、単語自体は多くの形式の1つに従う場合があります。これに対応するために、my_istream_iterator
ユーザーがイテレーターのテンプレート引数リストでポリシークラスのタイプを指定しなくても、入力ストリームを使用して作成するときにポリシークラスを指定できるようにする必要があります。たとえば、CSVファイルのエントリを行優先順に出力したい場合は、次のようなことができるようにしたいと思います。
mystream_iterator
ポリシークラスがイテレータによって内部的に使用されている場合でも、を作成するときにポリシークラスのタイプを指定するユーザーフォームを節約するにはどうすればよいですか?これは可能ですか?
ご協力いただきありがとうございます!
それが役立つ場合、my_istream_iterator
クラスの定義は次のようになります。
c++ - 文字を読み取るときにEOF(Ctrl + D)を無視するistream_iterator
istream_iterator
から文字を読み取るために使用しようとしていますcin
。Ctrl+を押すと、入力ストリームを終了Dする文字が送信されることを読みました。EOF
残念ながら、問題が発生しています。これが私のコードです:
私はそれを実行して:と入力し、次に+as df
を押します。最後のものなしでのみ出力し、入力を待ってハングします。入力してもう一度+を押すと、最後に残りが印刷され、次の入力からが印刷されますが、最後のはありません。そして、何も入力せずに最後に+を押すと、残りが出力されて終了します。CtrlDasd
f
gh
CtrlDf
g
h
CtrlDh
この最初のシーケンスの最後ですでに+をasdf
押したので、読み取りと終了を期待していました。CtrlD
取得後も入力を待っているのはなぜEOF
ですか?
前に読み取った最後の文字が印刷されないのはなぜEOF
ですか?また、前に何も入力せずに+
を押したときにのみ終了するのはなぜですか?
このループを期待どおりに動作させるには、どのように変更する必要がありますか?(つまり、前に何かを入力したかどうかに関係なく、入力で+シーケンスを取得した直後に読み取りを停止し、までのすべての文字を読み取ります)。CtrlD
CtrlDEOF