CStringクラス
1104 ワード
CStringクラスのヘッダファイルは#includeです.
CStringについて::GetLength()問:VC 5.0バージョンのヘルプファイルでCString::GetLength()は、文字列が占めるバイト数を返すASCIIについて、この記述は正しいが、Unicodeであれば実際にはバイト数ではなく文字数を返すので、ASCIIでもUnicodeでも文字列のバイト長を知るにはどうすればいいか知りたい.
答え:CStingの説明は確かにあなたが言ったように小さな問題があることに気づきました.CStingのGetData()メソッドは保護されているので、CStringクラスを継承するときに問題に遭遇した場合は、nDataLengthを自分で処理しなければなりません.nDatalengthが望んでいるかどうかはよく分かりませんが.MFCの例から以下のコードが見られる.
私にとって、nDatalengthはバイトではなく文字数のようですが、sizeof(TCHAR)が返す値が利用可能であれば、自分で計算するかもしれません.コードの中に入って、m_pchDataはプライベートではなく保護されています.文字列の終了文字を見つけて自分で文字列のバイト数を計算できるかもしれません.2)文字列のバイト数を取得するには、通常、次のコードを使用します.
注:このバイト数の長さには、ファイルの終端も含まれます.
CStringについて::GetLength()問:VC 5.0バージョンのヘルプファイルでCString::GetLength()は、文字列が占めるバイト数を返すASCIIについて、この記述は正しいが、Unicodeであれば実際にはバイト数ではなく文字数を返すので、ASCIIでもUnicodeでも文字列のバイト長を知るにはどうすればいいか知りたい.
答え:CStingの説明は確かにあなたが言ったように小さな問題があることに気づきました.CStingのGetData()メソッドは保護されているので、CStringクラスを継承するときに問題に遭遇した場合は、nDataLengthを自分で処理しなければなりません.nDatalengthが望んでいるかどうかはよく分かりませんが.MFCの例から以下のコードが見られる.
Void CString::AllocBuffer(int nLen)
{
if (nLen == 0)
Init();
else {
CStringData* pData = (CStringData*) new
BYTE[sizeof(CStringData) + (nLen+1)*sizeof(TCHAR)];
pData->nRefs=1;
pData->data() [nLen] = '/0';
pData->nDataLength = nLen; //nLen is assigned to
nDataLength
pData->nAllocLength = nLen;
m_pchData = pData->data();
}
}
私にとって、nDatalengthはバイトではなく文字数のようですが、sizeof(TCHAR)が返す値が利用可能であれば、自分で計算するかもしれません.コードの中に入って、m_pchDataはプライベートではなく保護されています.文字列の終了文字を見つけて自分で文字列のバイト数を計算できるかもしれません.2)文字列のバイト数を取得するには、通常、次のコードを使用します.
int nBytes = (csSomeCString.GetLength() + 1) * sizeof(TCHAR);
注:このバイト数の長さには、ファイルの終端も含まれます.