TextBoxと改行コード

ostringstream を利用して、簡単なログを記録し、それを TextBox (Auto VScroll フラグ付き) に出力しようとしました。 こんなコード。 …あ、ちなみに、TCHAR を使って ascii / unicode を切り替えられるようにしています。


  typedef std::basic_ostringstream<TCHAR> tostringstream;

  tostringstream strStrteam;
  strStrteam << _T("Error : LineNo : ") << nLineNo << _T("書式がおかしいのかしら〜!?\n");
  strStrteam << _T("Warn  : LineNo : ") << nLineNo << _T("入力値がおかしいですぅ。使えない野郎ですぅ。\n");
  strStrteam << _T("…どうでもいいけど、中々完成しないのだわ…\n");

  HWND hTextBoxWnd; // 代入済みとする
  ::SetWindowText(hTextBoxWnd, strStrteam.str().c_str());

こんな感じで TextBox に文字列を投げると、改行されずに "・" になる……って、そういえば、Windowsの改行コードは \r\n だったわなぁ。 というわけで、改行コードを \n から \r\n に置き換えて完了っと。

と、今回はこれで問題ないのですが… これ、tofstream とかも一緒に併用して処理する場合ってちょっと面倒な問題抱える気がするんですよ。

tostringstream を tofstream*1 へ普通に投げる

oStream << strStream.str();

こんな感じのコードになると思いますがー(多分)

テキストストリームだと \n\r\n に置き換えて出力するわけで、結果 \r\r\n というコードがファイルに書かれてしまうことになる気が…。 \r 被っちゃいやん。 というわけで、この案はアウト。

tostringstream を tofstream へバイナリとして書き込む

const tstring& str = strStream.str();
oStream.write(str.c_str(), str.length() * sizeof(TCHAR));

こんな感じですか。

ascii であれば上手くいくような気がしますが、unicodeビルドだと unicode文字列自体が書き込まれてしまうワナ。 Win2000 からであれば、メモ帳が unicode 対応してるので(多分)開けると思いますが、Win9x は全滅だろうなぁ…。^^;

というわけで、この案もアウト。

tostringstream の中にある \r 削除しちゃえ

tstring str = strStream.str();

// コントロールの場合は直接
SetWindowText(hTextBox, str.c_str());
// ファイルに書き込むときは \r を削除しちまう。 strLine.erase ( std::remove(strLine.begin(), strLine.end(), _T('\r')), strLine.end() ); oStream << str;

tostringstream に溜めた内容を tstring にまずコピー。 Windowsコントロールのときは \r\n である必要があるのでそのまま利用。 ファイルに書き込む時は、その文字列の中にある \r を削除してから書き込んでみる。 おお? これなら頑張れそうじゃn

asciiの時*2、マルチバイト文字の2バイト目に \r って…有る?無い? …なんか怖いぞ俺。


…と調べてみたら、2バイト目には 0x40〜の値しか利用されないようで、\r == 0x0D は出てこない模様。( Shift_JIS - Wikipedia より)
ということでコレで問題なさそう。


…ホントに大丈夫だろうなぁ?(ぉ

つか、実はこっそりと専用の関数が何か用意されてたりしそうな感じが…

*1:std::basic_ofstream<TCHAR> ね

*2:shift_jisの時か^^;