タイトルの通りなのですが、
あるクラスの中を見ていたら、MFCの派生でないクラスで、ほとんど
APIのみで書いてあるのですが、CStringだけは一部使ってます。
早急な用途はないのですが、CStringさえ使わなければSDKでも使いまわせるなあ、
なんて思ったのです。
普通の代入や連結はできても、Formatのような使い方がわかりません。
sprintf(str.c_str(),iの数値は%dです,i)
こう書いたら、const char* から char*への代入はできません。
といわれました。(まあ、あたりまえなんですが)
str.begin()を入れたら落ちました。(これもあたりまえ)
char配列を作っておいて、それにsprintfしてから代入すればもちろんできるのですが、
もうちょっとスマートな書き方があるのかなと思いまして…
よろしくお願いします。
環境はwin2000 sp3 VC++6 sp5 MFCです
#include <sstream>
#include <string>
std::ostringstream stream;
stream << iの数値は << i << です;
std::string str = stream.str();
επιστημηさんレスありがとうございます。
std::ostringstreamなるものがあるんですね。
私の持ってる、ピアソン・エデュケーション社の
標準テンプレートライブラリによるC++プログラミング第2版には、
載ってませんでした。
STLってstring vector list map ..のコンテナと反復子、それとアルゴリズム
って思ってたのに他にいろいろあるんですね。
こういうのって一度本腰入れて、ヘッダー全部読むものなのかな。
もっと勉強します。
私はこんな関数を作ってずっと使ってます。汚いソースだけど、参考になれば。
// printf 形式のフォーマット
static string Format( const char* format, ... ){
static std::vector<char> tmp(1000);
va_list args, source;
va_start(args, format);
source = args;
while(1){
args = source;
if( _vsnprintf( &tmp[0], tmp.size(), format, args ) == -1 ){
tmp.resize( tmp.size() * 2 );
}else{
break;
}
}
tmp.push_back('\0');
string ret = &(tmp[0]);
va_end(args);
return ret;
}
解決チェックしてしまったんですが、また教えてください。
早速やってみたのですが、たった4行なのにコンパイルエラーになってしまいました。
ただのスペルミスかと思って何度も見直したんですが、あっていると思います。
やった事は、新規作成 - MFC - SDI -ドキュメントなし にこれだけ書いたのですが、
何か他に必要なのでしょうか。
#include stdafx.h
#include STLTest.h
#include ChildView.h
#include <string>
#include <sstream> <-これを追加
-------------------------------
void CChildView::OnPaint()
{
CPaintDC dc(this); // 描画用のデバイス コンテキスト
// TODO: メッセージ ハンドラのコードをここに追加してください。
int a = 500;
std::ostrstream str ;
str << _T(aの値は) << a <<_T(です) ;
dc.TextOut(20,20,str.c_str());
// 描画のために CWnd::OnPaint を呼び出してはいけません。
}
エラー内容
E:\C++\STLTest\ChildView.cpp(58) : error C2039: 'ostrstream' :
'std' のメンバではありません。
E:\C++\STLTest\ChildView.cpp(58) : error C2065: 'ostrstream' :
定義されていない識別子です。
E:\C++\STLTest\ChildView.cpp(58) : error C2146: 構文エラー :
';' が、識別子 'str' の前に必要です。
E:\C++\STLTest\ChildView.cpp(58) : error C2065: 'str' :
定義されていない識別子です。
E:\C++\STLTest\ChildView.cpp(60) : error C2297: '<<' :
不正な右オペランドです。
using namespace std ;を入れてstd::をはずしても同じ状況です。
ostrstream ではありません。
ostringstream です。
>ostrstream ではありません。
>ostringstream です。
失礼しました。(^^ゞぜんぜんスペルミスでした。
> dc.TextOut(20,20,str.c_str());
ここもコンパイラにおこられました。
dc.TextOut(20,20,str.str());
こう直してもおこられました。
stringに入れなおしてやっとコンパイルできました。
PAIさん レスありがとうございます。
私も作ろうかと考えましたが、ありがちなもの自分で作るのって
私なんか抵抗あるんですよね。
皆さんそういうのはきっと作られているんでしょうね。
皆さんありがとうございました。
> dc.TextOut(20,20,str.str());
> こう直してもおこられました。
dc.TextOut(20,20,str.str().c_str());
επιστημηさん、何度もすみません。
エラーメッセージ出すだけのところに
string と ostringstreamの両方呼ぶのなんかやだなあと
思ってたところでした。
ありがとうございました。
> std::ostringstreamなるものがあるんですね。
>
> 私の持ってる、ピアソン・エデュケーション社の
> 標準テンプレートライブラリによるC++プログラミング第2版には、
> 載ってませんでした。
ストリーム族は、STLには(厳密には)含まれません。