文字列ストリームについて

[戻る]
Ultimate 2008/09/18(木) 13:38:10
[環境]
OS : WindowsXP Pro(SP2)
VC : VC++6.0

文字列ストリームを使用しているプログラムについて質問です。
(プログラムは自作ではなく、引き継いだため理解していない箇所があります)

xxx.h
std::istrstream* mIS;
std::ostrstream* mOS;

xxx.cpp
mlpBuff = new char [512 * 1024];
mIS = new std::istrstream(mlpBuff, 512 * 1024);
mOS = new std::ostrstream(mlpBuff, 512 * 1024);

*mOS << "SUCCESS" << std::endl
*mIS >> lCommand

(知識不足のためこれ以外にもなにかしている可能性もあります。
 申し訳ないです。)


上記が分からない箇所なのですが、
1 *mOSで出力した部分を*mISでなぜ取り出せるのかがわかりません。

2 mISなどを1次元配列のように膨大な値でインスタンス生成している箇所もわかりませ
ん。

上記の2点について、ストリームに詳しい方お教えいただけないでしょうか。

tetrapod 2008/09/18(木) 15:11:33
まず strstream は過去の遺物 (既に言語規格書から削除されている) なので、
提示ソースコードを詳しく理解して使い続けるのはお勧めしない。
この際だから stringstream に書き換えることを強く推奨する。

それでも解説が必要?

Ultimate 2008/09/18(木) 16:33:38
>この際だから stringstream に書き換えることを強く推奨する。
>それでも解説が必要?

ソースが10万行ほどあるので、
そのために今工数を取れない状況です。

再作成するときがあれば、
上記を参考にさせていただきます。

申し訳ないですが、解説をお願い致します。

tetrapod 2008/09/18(木) 16:55:50
10万行すべての行でこのストリームを使っているわけではないと思うが・・

まず 2 のほうから
strstream は char [] をバッファとするストリームを作る。
この例ではバッファ用領域を外から与えているわけだ。
char buf[64]; ostrstream oss(buf, 64);
なら理解できる?同じことだ。
char buf[512KiB]; を new して strstream で使うバッファとしているだけ。

・・って mIS や mOS は1個しかないんだけどその辺はOK?
ストリームを何万個も作っているわけぢゃないぞ。

1 は、同じバッファを入力ストリームと出力ストリームで共用しているので
出力ストリームで出力すれば入力ストリームのバッファも書き換わってるだけ。

ってこの程度の解説ならマニュアルに載っていると思うけど読んだ?

Ultimate 2008/09/18(木) 17:58:13
[[解決]]
>10万行すべての行でこのストリームを使っているわけではないと思うが・・
確かにそのとうりです。
しかしI/Oの部分はすべてこれなので、
その部分を変えるとなると、
少なからず他の部分の影響も考慮すると
1人月はかかるのではないかと。
(自分の技術不足のせいなのですが)

>まず 2 のほうから
>strstream は char [] をバッファとするストリームを作る。
>この例ではバッファ用領域を外から与えているわけだ。
>char buf[64]; ostrstream oss(buf, 64);
>なら理解できる?同じことだ。
>char buf[512KiB]; を new して strstream で使うバッファとしているだけ。
>・・って mIS や mOS は1個しかないんだけどその辺はOK?
>ストリームを何万個も作っているわけぢゃないぞ。
>1 は、同じバッファを入力ストリームと出力ストリームで共用しているので
>出力ストリームで出力すれば入力ストリームのバッファも書き換わってるだけ。
上記、かなり分かりやすい解説です。
バッファは1つでないと成り立たないとは思ったのですが、
*やNewで固定観念に捕らわれていました。

>ってこの程度の解説ならマニュアルに載っていると思うけど読んだ?
MSDNでは英語で表示されるのでHPを探したのですが、
調べ方ももっと勉強する必要があるようです。

tetrapodさんありがとうございました。
解決です。

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