問題タブ [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
ifstream finから読み取り、 istream_iterators を使用してベクトルvec1に入れようとしています。私はあちこちでこれらのものを見てきました:
後で使用するために istream_iterators を保持したいので、「これでうまくいくはずだ」と考えました。
... 機能しません =( 私のベクトルは完全に空です (私が読み取ったファイルは、数字だけの txt ファイルです)。
編集: txt は次のようになります。
c++ - ストリーム終了イテレータは構成可能ですか?
以下のコードを検討してください。
入力1 23 45
して押すとEnter
、ベクトルは 45、23、1、数字で埋められます。簡単な質問です。Enter
新しい数字を押して入力すると、数字がベクトルにも追加されるようにコードを変更するにはどうすればよいですか? つまり、ストリーム イテレータの終了を構成する方法は?
c++ - istreambuf_iterator を探しています明確化、Unicode 文字の完全なテキスト ファイルの読み取り
Scott Meyers による本「Effective STL」には、テキスト ファイル全体を std::string オブジェクトに読み込む良い例があります。
8 バイト文字として読み取ることに注意してください。これは非常にうまく機能します。最近では、Unicode テキスト (つまり、1 文字あたり 2 バイト) を含むファイルを読み取る必要があります。ただし、次のように、データを Unicode テキスト ファイルから std::wstring オブジェクトに読み込むように (単純に) 変更しようとすると、次のようになります。
返された文字列は、ワイド文字ですが、代替のヌルがまだ含まれています。たとえば、ファイルに Unicode 文字列「ABC」が含まれている場合、ファイルのバイト (Unicode 先頭バイト 0xFF、0xFE を無視) は次のようになります。 <'A'> <0> <'B'> <0> <' C'> <0>
上記の最初のコード フラグメントは、次の (char) 文字列の内容を正しく結果として返します。
sData [0] = 'A'<br> sData [1] = 0x00
sData [2] = 'B'<br> sData [3 ] = 0x00
sData [4] = 'C'<br> sData [5] = 0x00
ただし、2 番目のコード フラグメントが実行されると、(wchar_t) 文字列の内容が次のような望ましくない結果になります。
wsData [0] = L'A'<br> wsData [1] = 0x0000
wsData [2] = L'B '<br> wsData [3] = 0x0000
wsData [4] = L'C'<br> wsData [5] = 0x0000
あたかもファイルがまだバイトごとに読み取られ、単に個々の wchar_t 文字に変換されているかのようです。
wchar_t に特化した std::istreambuf_iterator は、ファイルが一度に 2 バイトずつ読み取られるべきだと思っていたのではないでしょうか? そうでない場合、その目的は何ですか?
私はテンプレートにたどり着きました(簡単な偉業ではありません;-)、イテレータは実際にファイルをバイトごとに読み取り、それを内部の変換ルーチンに渡しているようです。 2 バイトを受信した後でのみ)。
この一見些細なタスクについて、Web 上の多くのサイト (このサイトを含む) を検索しましたが、この動作の説明や、必要と思われる以上のコードを必要としない適切な代替案は見つかりませんでした (例: A Google Web を検索すると、同じ 2 番目のコード フラグメントが実行可能なコードとして生成されます)。
動作することがわかった唯一のものは次のとおりです。これは、wstring の内部バッファーに直接アクセスする必要があり、それを型強制する必要があるため、チートであると考えています。
ああ、避けられない「なぜファイルをバイナリ モードで開くのか、なぜテキスト モードで開くのか」という疑問を未然に防ぐために、ファイルがテキスト モード (デフォルト) で開かれたかのように意図的に開くということは、CR/LF ("\ r\n" または 0x0D0A) シーケンスは LF ("\n" または 0x0A) シーケンスに変換されますが、ファイルの純粋なバイト読み取りではそれらが保持されます。いずれにせよ、それらの頑固者にとって、それを変更しても、当然のことながら、何の効果もありませんでした.
ここで 2 つの質問があります。2 番目のケースが期待どおりに機能しないのはなぜですか (つまり、これらの反復子で何が起こっているのか)、そして Unicode 文字のファイルを wstring にロードする際のお気に入りの「コーシャ STL 方法」は何ですか? ?
ここで何が欠けていますか。それはばかげたものでなければなりません。
クリス
c++ - istream_iteratorを初期化すると、ifstream.fail()が設定されます
ファイルからboost::dynamic_bitsetに大量のデータをインポートしようとしています。これを実現するために、dynamic_bitset(uint32_t)のブロックサイズに一致するistream_iteratorを使用したいと考えていました。
以下に示すように、インポートするファイルの場所を使用してifstreamを設定します。ただし、istream_iteratorをifstreamで初期化すると、ifstreamの失敗ビットが設定されます。
これが発生している理由に関するアドバイスはありますか?
cplusplus.comによると:
フェイルビットは通常、エラーが操作自体の内部ロジックに関連している場合に入力操作によって設定されるため、ストリーム上の他の操作が可能になる場合があります。通常、badbitは、エラーにストリームの整合性の喪失が含まれる場合に設定されます。これは、ストリームで別の操作が実行された場合でも持続する可能性があります。badbitは、メンバー関数badを呼び出すことで個別にチェックできます。
編集:
ハッシュには、別のCアプリケーションのSHA1実装によって生成された160ビットのハッシュが含まれています。このファイルには数千のハッシュがあります。1バイトの20ブロックではなく、4バイトの5ブロックを読み取りたい(したがって、ブロックサイズとしてuint32_tを使用)Cアプリケーションから関連するコードを取得しました。これは、生成されたハッシュを示してから、ファイルに書き込まれる:
c++ - コピーによるストリームからの読み取りを実装する
文字シーケンスを表すクラスがあり、operator >>
それを実装したいと思います。私の実装は現在次のようになっています。
ただし、次の場合は予想どおり失敗します。
特に、「<code>GATTACA FOO」のスペースに到達すると、コピーが停止し (予期される)、failbit が設定されますistream
(これも予期されます)。ただし、読み取り操作は実際には成功しましたseq
。
を使用してこれをモデル化できますstd::copy
か? 代わりにを使用することも考えistreambuf_iterator
ましたが、これは実際にはこの特定の問題を解決しません。
さらに、入力 "<code>GATTACAFOO" に対する読み取り操作は失敗するはずです。その入力は有効な DNA 配列 (私のクラスが表すもの) を表していないからです。一方、int
入力からの読み取りは42foo
実際にはC++で成功するため、すべての有効なプレフィックスを有効な入力と見なす必要がありますか?
(ちなみに、これは明示的なループではかなり簡単ですが、アルゴリズムを優先して明示的なループを避けようとしています。)
c++ - libc ++ istream_iteratorを使用してファイル内の0xFFを読み取るにはどうすればよいですか?
次のサンプルコードについて考えてみます。
そして、以下を含む入力ファイル: "foo \ xffbar":
ここで、clanglibc++とgnulibstdc++を使用したテストについて説明します。
ご覧のとおり、libc ++バージョンは、0xffがストリームの終わりであると見なし、読み取りを停止します。したがって、これはいくつかの質問につながります。
1)これは私が報告すべきlibc ++のバグですか?私のグーグル検索で既存のバグは何も見つかりませんでした。
2)この問題を回避する良い方法はありますか?
編集
次のコードが機能します。
これはバイナリ変換の問題であると私に信じさせますが、それはlibstdc++が正しく機能する理由を説明していません。
EDIT2
バイナリなしでファイルを使用することも問題なく機能します。
ですから、間違いなく何か怪しいことが起こっています。ただし、イテレータではなく、cinの実装に問題があるようです。
c++ - この反復子宣言の何が問題になっていますか
クラスにメソッドがあります。これは次のとおりです。
、ビルドしようとすると、「std::ifstream」を「std::basic_istream<_Elem,_Traits> &」に変換することは不可能だと言われました? これは何を意味し、何をすればよいのでしょうか (イテレータを詳しく調べることを除いて、つまり ;-) )?
c++ - std::istream_iterator、メモリ消費量
イテレータを使用してテキスト ファイルを反復処理しようとしています。
最初の行の後、ファイルからいくつかのデータを読み取ります (MyData 型に演算子 >> を使用します)。予想通り。
残念ながら、その後メモリ消費量が増加し、istream_iterator
ファイル全体をメモリにロードしようとしたようです。数秒後 (out_of_memory 例外がスローされた場合)、デバッガーは 2 行目に移動します。しかし、ファイルの読み取りに失敗し、それ以上何も読み取れません。
質問:
istream_iterator
これは(ファイルをメモリにロードするための) 正しい動作ですか?
小さなファイル (20MB など) の場合、これは観察されません。
たぶん、そのような大きなファイルの場合、一般的なgetline
方法を使用する必要がありますか?
c++ - istream_iterators 間の距離
次のように、事前にベクトルのコンストラクター引数にstd::cin
使用して、読み取られた要素の量をカウントしようとしています。std::distance
明らかに、これを で 1 ステップで完了することができますstd::copy
が、それには事前にサイズを設定する必要があります。私の質問はベクトルに関するものではなくstd::istream_iterator
、ストリームに影響を与えずに使用して任意の入力のサイズを取得することです。何か案は?
c++ - istream_iterator を使用してコピーし、ostream_iterator を出力に使用する C++
次のコードを使用して、文字列を入力し、範囲を見つけて、出力にコピーしようとしました
unix コマンド ラインからプログラムを実行し、(ctrl+z) を使用して入力を終了しましたが、ターミナルには何も書き込まれませんでした。istream_iterator で他のスレッドを読みましたが、入力が完了したことをプログラムに伝える唯一の方法は ctrl+z だと思います。しかし、後で出力する必要がありますか?(ちなみに、最初と最後のイテレータが有効であることを確認するために、「開始」と「終了」を含む文字列を入力しました)。
上記のプログラムを IDE (Xcode) からも実行しましたが、入力用のコマンド ラインが表示されません。表示するものはありますか? または私はいくつかをしなければなりませんか
入力を求めるプロンプトの種類は?
ありがとう!