strstream に区切り文字を追加

[戻る]
f_take2000 2004/01/22(木) 17:29:29
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です。

amn 2004/01/23(金) 09:21:17
strstream より stringstream の方が(バッファ長を自分で管理する必要が
ない分だけ)楽につかえるかと思います。

それはさておき、目的を達するのに別のアプローチでもよいのなら、
たとえば boost::tokenizer を使ってみてはいかがでしょうか。

http://boost.org/

dairygoods 2004/01/23(金) 10:58:51
cStrStrm << "1, 2, 3" << ends;
char comma;
cStrStrm >> i1 >> comma >> i2 >> comma >> i3;

とか。

f_take2000 2004/01/23(金) 11:24:00
返事ありがとうございます。
やりたいことは、コマンドインタプリタみたいなことで、そのために、フォーマットクラ
スの、エラー処理と、>>演算子が使いたいのです。
はじめにかかないで、すみません。
例)
cmdname a,b,c
a,b がint
cが、string であるようなコマンド



amn さん
boost::tokenizerをみてみました。ただ、iterater のなかで、for loop の回った回数な
どで、分岐しなくては、いけないので、コードがすこし、きたなくなってしまとおもって
います。でも、これがだめなら、ちょっと検討してみます。

dairywood さん、
ユーザーに、区切り文字の前に、スペースを入れてもらうのは、ちょとかっこわるくてい
やです。

dairygoods 2004/01/23(金) 11:31:42
> ユーザーに、区切り文字の前に、スペースを入れてもらうのは、
> ちょとかっこわるくていやです。

cStrStrm << "1,2,3" << ends;
char comma;
cStrStrm >> i1 >> comma >> i2 >> comma >> i3;

こう書けばよかったかな?

amn 2004/01/23(金) 14:02:30
こんにちは。

> やりたいことは、コマンドインタプリタみたいなことで <snip>

ということであれば、boost::spirit が適しているのではないでしょうか。
ご検討の選択肢にいれてみてはいかがでしょう。

http://www.kmonos.net/alang/boost/classes/spirit.html

やその他検索すると日本語で解説したページもみつかるかと思います。

f_take2000 2004/01/24(土) 17:35:33
返事が遅れてすみません
dairygoods-san の方法だと,コマンドの中に,stringがはいっていたりする場合に,うまくい
きません. cmdnameが、string だったりした場合.
例)hoge,1,2,3

amn-san sprits のマニュアルを,読み始めています.これは,結構すごい(変態?)。最初のイ
ントロダクションで書いてあることは,私が感じていたことなのです。いい情報ありがとうござ
いました。計算機を作って終りにならないようにします。(yacc/lex のときのように)

古いスレッドには追加発言できません。