|
CPallini wrote: Big Grin ..................kidding................. Big Grin
You got me there, Pallini
|
|
|
|
|
C'est la vie... If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Just to be contrary, I use wxWidgets. It's free, open source, and cross platform. You measure democracy by the freedom it gives its dissidents, not the freedom it gives its assimilated conformists.
|
|
|
|
|
hi,
i want to load menu dynamically to my dialog from dll.hw can i do that?
|
|
|
|
|
|
So having bashed my head against the wall and having done as much reading as possible, I'm still confused.
My understanding from other posts was that char* is an array of single bytes, and that in VS2005, CString is Unicode. But I seem to have a mixture of this...
I'm doing:
void CMyClass::MyFunc()
{
CFile myFile(L"C:\\MyFile.txt", CFile::modeRead);
char* pchContents = new char[myFile.GetLength()];
myFile.Read(pchContents, myFile.GetLength());
CString myString = (char*)pchContents;
myFile.Close();
delete[] pchContents;
}
but myString is strangely spaced out and have odd bits added to the front and back. Does this mean the contents of pchContents got turned into wide characters?
Anyway, the problem is that after a load of other operations, I have to turn myString back into char* . But wcstombs_s fails because it encounters wide characters.
What I really don't get is the fact that this whole thing works if I don't read from file into myString but build it up using MSXML and cast the resulting BSTR into CString . I thought all CString was wide, so how come I seem to be having two different flavours?
=========================================
The long and the short of it is that I now have a working piece of code.
I'm not entirely sure what happened.
Basically, I was reading in a file (xml file) edited using Visual Studio 2005. I rewrote the thing in notepad and it works fine now.
I guess my code was right in the first place, but the file I was reading wasn't.
I'm guessing that Visual Studio added some MBCS into my file outside of what I typed and that was tripping up my wcstombs_s .
Am I right?modified on Sunday, March 14, 2010 11:55 PM
|
|
|
|
|
try
CString myString(pchContents);
or if you use assignment operator first convert pchContents to widechar using mbstowcs like functions and assign resulting widechar pointer to CString obj.
assigning BSTR into CString works as BSTR is defined as WCHAR*.
wcstombs_s will definitly work, provided you use it for unicode string to multi byte converstion.
|
|
|
|
|
Thanks for the suggestion, but the exact same result as before.
|
|
|
|
|
can u explain whats going wrong with some piece of code?
|
|
|
|
|
PaulowniaK wrote: My understanding from other posts was that char* is an array of single bytes, and that in VS2005, CString is Unicode.
CString is Unicode-ready in the Unicode projects only virtual void BeHappy() = 0;
|
|
|
|
|
I suggest this nice article[^] (and the next one). Things will probably be much clearer afterwards.
|
|
|
|
|
Thanks, I have read this.
The trouble is, I don't know how to tell if I'm working in SBCS, DBCS or Unicode...
Or at least I thought I knew but it looks like I don't...
I wonder if it's because CString's constructor takes MBCS and Unicode, so reading from CFile does one version and writing using MSXML does the other? Almost, but not quite, entirely unlike... me...
|
|
|
|
|
CString become CStringW if your project setting is UNICODE and it becomes CStringA if the project settings is Multi-byte.
|
|
|
|
|
I think my little grey cells are just about OK with that...
But, then, what do you think about the fact that I have 2 CString s, one is apparently CStringA and the other is CStringW in the same project, which I am quite certain is Unicode. Almost, but not quite, entirely unlike... me...
|
|
|
|
|
You are free to explicitly declare CStringA or CStringW independent of the project settings.
CStringA csA = "Hello";
CStringW csW = L"Hello";
|
|
|
|
|
Rejeesh.T.S wrote: You are free to explicitly declare CStringA or CStringW independent of the project settings.
The trouble is that I seem to have a string that is both CStringA and CStringW at the same time, depending on how the values are set.Almost, but not quite, entirely unlike... me...
|
|
|
|
|
CString has more to offer
void CMyClass::MyFunc()
{
CFile myFile(L"C:\\MyFile.txt", CFile::modeRead);
CString myString;
myFile.Read(myString.GetBuffer(myFile.GetLength()+1), myFile.GetLength());
myString.ReleaseBuffer();
myFile.Close();//not needed ?
}
and some error checking for the File I/O is missing Press F1 for help or google it.
Greetings from Germany
|
|
|
|
|
My attempt goes wrong here:
myString.ReleaseBuffer();
Something about lengths not matching. I've tried taking off the +1 but no luck.
I get a debug assertion:
Expression: nLength <=GetData()->nAllocLength
Almost, but not quite, entirely unlike... me...
|
|
|
|
|
i guess your are mixing Multibyte and Unicode. Compile the project in Unicode. Press F1 for help or google it.
Greetings from Germany
|
|
|
|
|
KarstenK wrote: i guess your are mixing Multibyte and Unicode. Compile the project in Unicode.
Yes, I have been compiling my project(s) in Unicode.Almost, but not quite, entirely unlike... me...
|
|
|
|
|
|
CFile myFile(_T("C:\\u_MyFile.txt"), CFile::modeRead);
TCHAR* pchContents = new TCHAR[myFile.GetLength()];
myFile.Read(pchContents, myFile.GetLength());
CString myString = (TCHAR *)pchContents;
myFile.Close();
delete[] pchContents;
|
|
|
|
|
CFile myFile(_T("C:\\u_MyFile.txt"), CFile::modeRead);
int len = myFile.GetLength();
TCHAR* pchContents = new TCHAR[len + 1];
memset(pchContents, 0, (len + 1) * sizeof(TCHAR));
int n = myFile.Read(pchContents, len);
CString myString = (TCHAR *)pchContents;
myFile.Close();
delete[] pchContents;
|
|
|
|
|
Thanks for the suggestions, but neither worked... Almost, but not quite, entirely unlike... me...
|
|
|
|
|
The below works if u_MyFile.txt is UNICODE and the project configuration is also UNICODE.
When switching project configuration it is better to use the portable type TCHAR.
CFile myFile(_T("C:\\u_MyFile.txt"), CFile::modeRead);
int len = myFile.GetLength();
const int MB_BUFFER_SIZE = 1024;
TCHAR* pchContents = new TCHAR[len + 1];
memset(pchContents, 0, (len + 1) * sizeof(TCHAR));
int n = myFile.Read(pchContents, len);
char mbString[MB_BUFFER_SIZE];
size_t countConverted;
mbstate_t mbstate;
#ifdef _UNICODE
pchContents++;
::memset((void*)&mbstate, 0, sizeof(mbstate));
countConverted = wcsrtombs(mbString, (const wchar_t **)&pchContents, MB_BUFFER_SIZE, &mbstate);
CStringA myString = mbString;
if (errno == EILSEQ)
{
printf( "An encoding error was detected in the string.\n" );
}
else
{
printf( "%s\n", myString.GetBuffer());
}
#else /* assuming txt file read is not UNICODE */
CString myString = pchContents;
printf( "%s.\n", myString.GetBuffer());
#endif
|
|
|
|