問題タブ [istream]
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++ - 出力および入力用のファイル名に対する単純なユーザー要求
.out
プログラムが読み取る必要があるファイル名を入力し、代わりに拡張子付きの名前を出力するようにユーザーに要求するにはどうすればよいですか?
例:
しかし、ファイルを元のドキュメント タイプ (IE:.txt) ではなく filename.out として保存する必要があります。
私はこれを試しました:
しかし、私はこれらのエラーが発生します:
c:\users\matt\documents\visual studio 2008\projects\dspi\dspi\dspi.cpp(41): エラー C2228: '.txt' の左側には class/struct/union が必要です 1> タイプは 'char [256 ]'
c:\users\matt\documents\visual studio 2008\projects\dspi\dspi\dspi.cpp(42): エラー C2228: '.out' の左側には class/struct/union が必要です 1> タイプは 'char [256 ]'
c++ - C ++ istreamを「カーボンコピー」しますか?
私自身の小さなパーサー フレームワークのために、次の関数を定義しようとしています。
次に、次のようなものを書くことができます: (おそらく最良の例ではありません)
どんな助けでも大歓迎です。
c++ - "cin" と "File" の C++ 共通インターフェイス
cin とファイルの入力に共通のインターフェイスはありますか?
オプションパラメータを持つプログラムを作りたい
入力ファイルが指定されている場合はファイルから読み取り、指定されていない場合は cin から読み取る必要があります。
私が知る限り、どちらも実装していistream
ます。のようなことができるようin >> var
に、どのように設定しますか。in
istream
c++ - istream parse EVENT_TYPE(param1;param2; ...)
次のような文字列を解析するエレガントな方法を見つけようとしています。
EVENT_TYPE は多くの文字列定数の 1 つで、それぞれに 0 個以上のパラメーターがあります。これまでのところ、文字列「s」に EVENT_TYPE(param1;param2) が含まれている場合、次のように書くと思いました。
const string&を指定して、「これらの文字をスキップする」ように指示するとよいでしょう。そうではありません。あなたはこれについてどうしますか?:-)
アドバイスをありがとう!
c++ - std::istream::read の設計を理解する
std::istream
にはプロトタイプistream& read (char* s, streamsize n)
があり、実際に読み取られるバイト数は を呼び出して取得する必要がistream::gcount()
あり、 の有効性もistream
から知ることができますios::good
。
私が書こうとしていた別のストリームクラスの実装について同僚と話し合っていたとき、私はこの設計に従うかもしれないと言っていました。しかし、ユーザーに毎回gcountを呼び出させる代わりに、このようにプロトタイプを読み取って、1 回の呼び出しで解決できるようにすることもできistream& read (char* s, streamsize n, size_t &bytes_read)
、前者は扱いにくいと彼は言いました。std
私はのデザイン選択を弁護できませんでした。背後にある本当の理由は何istream::read
ですか?
c++ - istream 経由でブロックされたスレッドを解放する方法
私は2つのクラスを作成しました。1 つは入力の読み取り (istream オブジェクトによる) と解析用で、もう 1 つはパーサーの出力の処理用です。
それぞれのインスタンスが 1 つあります。
istream::get() を呼び出すループでパーサーを実行し、入力に基づいて 2 番目のオブジェクトのコマンドを作成します。これらのコマンドは、2 番目のオブジェクトが別のスレッドで処理するキューに置かれます。
これで、最終的に「Quit」コマンドを送信できるようにする必要があることは明らかです。ただし、ここで問題が発生します。「Quit」コマンドは解析ループも終了する必要がありますが、istream::get() 内でキャッチされているため、終了する必要があることをパーサーに通知する方法が見つかりません。
そのメソッドからウェイクアップする方法が必要ですが、見つかりません...
istream::rdbuf() から ostream オブジェクトを作成することにより、istream オブジェクト (この場合は cin) にある種の「終了シーケンス」を書き込むことを考えました。しかし、それはうまくいきません - バッファへの書き込みを試みた後、badbit が設定されます。
StackOverflow の別の質問で、Boost ライブラリの asio クラスが言及されているのを見ましたが、サードパーティのライブラリには依存したくありません。
istream::get() からスレッドをウェイクアップする方法はありますか?つまり、プログラム内から istream バッファーに書き込む方法はありますか?
別のアプローチは、その特定の場所でクリーンアップが必要ないため、許容できるスレッドを強制終了することです。しかし、これはどのように行うことができますか?(私は POSIX スレッドの実装に依存しています)
.net - Delphi IStream の初期化に相当する .NET
次の Delphi コードがあります。
実際に IStream オブジェクトを COM コンポーネントに渡します。.NET には「System.Runtime.InteropServices.ComTypes.IStream」インターフェイスがありますが、適切な使用方法がわかりません。IStream をデータで初期化し、それを .NET の COM オブジェクトに渡す方法は?
c++ - C++ istream を繰り返す
を解析または反復する最良の方法は何istream
ですか? istream
を受け取り、それを解析してオブジェクトを作成する関数を作成する必要があるため、これを行う最も簡単な方法を考えていました。それを変換できるものでもstring
ダンディになります。
c++ - Stringsクラスの演算子>>をオーバーライドします
簡単な質問があります。カスタムStringクラスの演算子>>をオーバーライドする必要がありますが、その方法がわかりません。
このコードが機能することはわかっています。これは、問題を解決するための私の最初の方法だったからです。
ただし、仕様(これは宿題です)によると、空白を手動でチェックし、文字列がdata []に対して大きすぎないことを確認するために、一度に1文字ずつ読み取る必要があります。そこで、コードを次のように変更しました。
ただし、この新しいコードを実行すると、ユーザー入力のループに陥ります。では、is.get()を使用してデータを文字ごとに読み込むが、ユーザー入力が増えるのを待たないようにするにはどうすればよいですか?または、おそらく.get()以外のものを使用する必要がありますか?
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)
ループを終了させるために呼び出す必要があるのでしょうか。