strstream に文字列を入力したあと、複数の変数に取りだしたいのですが、デフォルトで
は、区切り文字が、スペースと改行のみです。この区切り文字を追加したいのですが、
(たとえば、コンマなど)できるのでしょうか?
よろしくお願いします。
例)
char hoge[100];
int i1,i2,i3;
strstream cStrStrm(ch,100,ios::out|ios::in);
cStrStrm << 1 2 3<<ends;
// この場合は、うまく取り出せる。
cStrStrm >> i1 >> i2>> i3;
//でも、次のように、コンマ区切りの文字列は、うまくいかない。
cStrStrm <<1,2,3<<ends;
// これは、だめ!
cStrStrm >> i1>>i2>>i3;
環境は、Windows2000 vc++6.0です。
strstream より stringstream の方が(バッファ長を自分で管理する必要が
ない分だけ)楽につかえるかと思います。
それはさておき、目的を達するのに別のアプローチでもよいのなら、
たとえば boost::tokenizer を使ってみてはいかがでしょうか。
cStrStrm << 1, 2, 3 << ends;
char comma;
cStrStrm >> i1 >> comma >> i2 >> comma >> i3;
とか。
返事ありがとうございます。
やりたいことは、コマンドインタプリタみたいなことで、そのために、フォーマットクラ
スの、エラー処理と、>>演算子が使いたいのです。
はじめにかかないで、すみません。
例)
cmdname a,b,c
a,b がint
cが、string であるようなコマンド
amn さん
boost::tokenizerをみてみました。ただ、iterater のなかで、for loop の回った回数な
どで、分岐しなくては、いけないので、コードがすこし、きたなくなってしまとおもって
います。でも、これがだめなら、ちょっと検討してみます。
dairywood さん、
ユーザーに、区切り文字の前に、スペースを入れてもらうのは、ちょとかっこわるくてい
やです。
> ユーザーに、区切り文字の前に、スペースを入れてもらうのは、
> ちょとかっこわるくていやです。
cStrStrm << 1,2,3 << ends;
char comma;
cStrStrm >> i1 >> comma >> i2 >> comma >> i3;
こう書けばよかったかな?
こんにちは。
> やりたいことは、コマンドインタプリタみたいなことで <snip>
ということであれば、boost::spirit が適しているのではないでしょうか。
ご検討の選択肢にいれてみてはいかがでしょう。
http://www.kmonos.net/alang/boost/classes/spirit.html
やその他検索すると日本語で解説したページもみつかるかと思います。
返事が遅れてすみません
dairygoods-san の方法だと,コマンドの中に,stringがはいっていたりする場合に,うまくい
きません. cmdnameが、string だったりした場合.
例)hoge,1,2,3
amn-san sprits のマニュアルを,読み始めています.これは,結構すごい(変態?)。最初のイ
ントロダクションで書いてあることは,私が感じていたことなのです。いい情報ありがとうござ
いました。計算機を作って終りにならないようにします。(yacc/lex のときのように)