ReleaseBufferの引数に値を入れるときってどんなとき? – プログラミング – Home

ReleaseBufferの引数に値を...
 
通知
すべてクリア

[解決済] ReleaseBufferの引数に値を入れるときってどんなとき?


ソウ
 ソウ
(@ソウ)
ゲスト
結合: 18年前
投稿: 3
Topic starter  

ReleaseBufferで引数に値を入れるときとはどんなときでしょうか?

ヘルプなどをみてみたんですが、いまいちよくわからなくて。。

文字の最後がNULLだったら、省略できて
NULL以外ならそのサイズを引数にするでいいんでしょうか?

また、その引数を渡した時、ReleaseBufferはどういった動きをするんでしょうか?

よかったら教えてください


引用未解決
トピックタグ
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

どの ReleaseBuffer ? CString::ReleaseBuffer のこと?もしそうなら

・既に文字列長を自分で持っているときには、指定すれば中で呼んでるstrlen1回分速い
・既存の \0 終端文字の位置に関係なくもっと短くしたい場合に指定するといい
・\0 終端文字が buffer 内部にない場合は指定せざるを得ない
 指定した位置に \0 を入れてサイズ縮小してくれる。

中で何してるかは MFC ソース読むべし。簡単だし。


返信引用
ソウ
 ソウ
(@ソウ)
ゲスト
結合: 18年前
投稿: 3
Topic starter  

返信ありがとうございます。
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の引数に
ファイルのサイズを入れたら動くようになったので
これで、いいのかわからなくて質問してみました。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

・ファイルがテキストファイル
・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です。


返信引用
ソウ
 ソウ
(@ソウ)
ゲスト
結合: 18年前
投稿: 3
Topic starter  

tetrapod さん、Blueさん

おかげで理解できました。ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました