ReleaseBufferで引数に値を入れるときとはどんなときでしょうか?
ヘルプなどをみてみたんですが、いまいちよくわからなくて。。
文字の最後がNULLだったら、省略できて
NULL以外ならそのサイズを引数にするでいいんでしょうか?
また、その引数を渡した時、ReleaseBufferはどういった動きをするんでしょうか?
よかったら教えてください
どの ReleaseBuffer ? CString::ReleaseBuffer のこと?もしそうなら
・既に文字列長を自分で持っているときには、指定すれば中で呼んでるstrlen1回分速い
・既存の \0 終端文字の位置に関係なくもっと短くしたい場合に指定するといい
・\0 終端文字が buffer 内部にない場合は指定せざるを得ない
指定した位置に \0 を入れてサイズ縮小してくれる。
中で何してるかは MFC ソース読むべし。簡単だし。
返信ありがとうございます。
CString::ReleaseBufferです。
実は、こんな感じのソースで
CString pBuf;
file.GetStatus( fst );
// read file
LPTSTR p = pBuf.GetBuffer( (int)fst.m_size );
file.Read( p, (int)fst.m_size );
pBuf.ReleaseBuffer( (int)fst.m_size );
file.Close();
GetBufferして
ReadしたあとにReleaseBuffer()したら
エラーになり、ReleaseBufferの引数に
ファイルのサイズを入れたら動くようになったので
これで、いいのかわからなくて質問してみました。
・ファイルがテキストファイル
・fileが CFile
として、
>file.Read( p, (int)fst.m_size );
の場合、pには文字列の終端を表す'\0'が格納されません。
ですので、引数なしの ReleaseBuffer を呼ぶと、文字列がどこまでか不定のため動かな
くなってしまうのでしょう。
引数を指定すると、文字列長が指定されるのでうまくいくのです。
ちなみに、
>LPTSTR p = pBuf.GetBuffer( (int)fst.m_size );
を
LPTSTR p = pBuf.GetBufferSetLength( (int)fst.m_size );
とすれば、
>pBuf.ReleaseBuffer( (int)fst.m_size );
は
pBuf.ReleaseBuffer();
でOKです。
tetrapod さん、Blueさん
おかげで理解できました。ありがとうございました。