問題タブ [stringstream]
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++ - std :: stringstreamは、文字列からintと文字列を読み取ります
私はC++でプログラミングしていますが、次のことを実現する方法がわかりません。
ファイルストリームをメモリにコピーし(要求されたため、ストリームから読み取ることをお勧めします)、その値にアクセスして文字列とint変数に格納しようとしています。
これはインタプリタを作成するためのものです。私が解釈しようとするコードは(すなわち):
これは簡単なサンプルコードです。これで、値は最初は「マップ」構造に格納され、後ですべてが「解釈」されるときにアクセスされます。保存される値は次のとおりです。
intlnum//行番号
string cmd //コマンド(PRINTおよびGOTO)
string exp //式(この場合はAと10ですが、(a * b)-cのような式を保持できます)
質問には次のコードが与えられますが、これらの値にアクセスしてメモリに保存するにはどうすればよいですか?また、exp文字列は可変サイズ(単なる変数または式にすることができます)であるため、それを読み取って文字列に格納する方法がわかりません。
コード:
これが明確であることを願っています。
ご協力ありがとうございました。
バレリオ
c++ - std::stringstream を事前に割り当てる必要がありますか?
私std::stringstream
は自分のアプリケーションで文字列とエラー メッセージを作成するために広く使用しています。stringstreams
通常、自動変数は非常に短い寿命です。
このような使用法は、すべての変数に対してヒープの再割り当てを引き起こしますか? 一時変数からクラスメンバーstringstream
変数に切り替える必要がありますか?
後者の場合、どうすればstringstream
バッファを予約できますか? (十分な大きさの文字列で初期化する必要がありますか、それとももっと洗練された方法がありますか?)
c++ - C++ 文字列ストリームを使用して int を追加するには?
「何か」という単語(または任意の単語)を含む文字列ストリームにintを追加する方法の簡単な例を教えてもらえますか?
c++ - 1つの文字列変数に複数の単語を抽出します
1つの文字列変数に2つ以上の単語を抽出したいのですが。これまで読んだところ、それは不可能のようです。もしそうなら、他にどのようにそれを行うのですか?name
数字(年齢)の前にすべての文字を取得したいのですが。
sscanfを使用するのが最も快適だと思いますが、明らかにできません。
age
たとえば、必要なのは前にすべての単語を抽出する機能です。
c++ - istringstream を使用して可変長のメモリ ブロックを処理する
一部のメモリからistringstream
エンコードされたものを再作成するために使用しようとしています。wstring
メモリは次のように配置されます。
- wstring エンコーディングの開始を示す 1 バイト。勝手にこれは「!」です。
- 文字列の文字長をテキスト形式で格納するための n バイト。たとえば、0x31、0x32、0x33 は「123」、つまり 123 文字の文字列になります。
- 1 バイト区切り (スペース文字)
- 文字列を構成する wchar である n バイト。wchar_t はそれぞれ 2 バイトです。
たとえば、バイト シーケンスは次のとおりです。
21 36 20 66 00 6f 00 6f 00
"!6 foo" です (ドットを使用して char 0 を表します)
私が持っているのは、pData
このエンコードされたデータを含むメモリブロックの先頭への char* ポインター (と呼びましょう) だけです。データを消費して wstring ("foo") を再構築し、ポインタをエンコードされたデータの終わりを過ぎた次のバイトに移動する「最良の」方法は何ですか?
istringstream を使用して、プレフィックス バイト、文字列の長さ、および区切り文字を消費できるようにしていました。その後、読み取るバイト数を計算し、ストリームのread()
関数を使用して、適切にサイズ変更された wstring に挿入できます。問題は、そもそもこのメモリを istringstream に入れるにはどうすればよいかということです。最初に文字列を作成してから、それを istringstream に渡すことができます。
ただし、文字列が最初の null バイトで切り捨てられるため、これは機能しません。または、文字列の他のコンストラクターを使用して、使用するバイト数を明示的に指定することもできます。
len
これは機能しますが、事前に何があるかを知っている場合に限ります。データが可変長であることを考えると、これは注意が必要です。
これは本当に解決可能な問題のようです。ストリングスとストリームの新人ステータスは、簡単な解決策を見落としていることを意味しますか? それとも、文字列全体のアプローチで間違ったツリーを吠えていますか?
c++ - C ++:文字列ストリームにはどのような利点がありますか?
C ++で文字列ストリームを使用する実際の例、つまり、ストリーム挿入およびストリーム抽出演算子を使用した文字列ストリームへの入力と出力について教えてもらえますか?
c++ - ostringstream の malloc/free を減らす方法はありますか?
私は組み込みアプリを書いています。いくつかの場所では、std::ostringstream を頻繁に使用しています。これは、私の目的には非常に便利だからです。ただし、ストリームにデータを追加すると、malloc と free の呼び出しが多くなるため、パフォーマンスの低下が極端であることがわかりました。それを回避する方法はありますか?
私が最初に考えたのは、ostringstream を静的にして、ostringstream::set("") を使用してリセットすることでした。ただし、関数を再入可能にする必要があるため、これは実行できません。
c++ - stringstream の精度をグローバルに設定する
30 を超えるファイルがあるプロジェクト全体で stringstream を使用しています。私は最近、double を stringstream に解析していた stringstring によって引き起こされた問題を克服し、精度が失われました。そこで、すべてのファイルの精度を設定したいと思います。各ファイルのどこにでも変更を加える必要がないように、グローバルに設定する方法はありますか。誰かがロケールを使用して可能かどうかを確認するように提案しました。
問題を解決してください。コードまたはコードへのリンクがあれば、より便利になります。
c++ - 単一のステートメントで一時的な stringstream を c_str() に変換する
次の関数を検討してください。
stringstream を使用して文字列を生成し、それをこの関数に渡したいとします。1 つのステートメントでそれを実行したい場合は、次のようにします。
これによりエラーが発生します: 'str()' は 'basic_ostream' のメンバーではありません。では、operator<< は ostringstream ではなく ostream を返します。ostringstream にキャストして戻すのはどうですか?
1) このキャストは安全ですか?
これで、operator<<("Value: ") 呼び出しが判明しました。実際には、ostream の operator<<(void*) を呼び出して、16 進アドレスを出力しています。これは間違っています。テキストが必要です。
2) 一時的な std::ostringstream() の operator<< が ostream 演算子を呼び出すのはなぜですか? 確かに、一時には「ostream」ではなく「ostringstream」のタイプがありますか?
一時的にキャストして、正しいオペレーター呼び出しを強制することもできます!
これは機能しているようで、「Value: 5」を f() に渡します。
3) 現在、未定義の動作に依存していますか? キャストは珍しいようです。
最良の代替手段は次のようなものであることは承知しています。
...しかし、私はそれを1行で行う動作に興味があります。誰かが (疑わしい) マクロを作りたいとします:
これは期待どおりに機能しますか?
c++ - C++でストリームの最大読み取り長を設定するには?
ストリームから特定の長さの char 配列にデータを読み取っています。読み取りの最大幅を、その char 配列に収まる十分な大きさにしたいと考えています。
char 配列を使用する理由は、個々のトークンの長さが特定の値を超えることはできないという仕様の一部であるため、コンストラクターの呼び出しをいくつか節約しています。
width() は自分のやりたいことだと思っていましたが、どうやら間違っていたようです...
編集:ストリーム抽出演算子を使用して抽出を実行しています。これは、値が空白で区切られたフラットなテキスト ファイルであるためです。