2009-08-06 1 views
3

Я пытаюсь внести изменения в некоторые устаревшие коды. Мне нужно заполнить char[] ext с расширением файла, полученным с использованием filename.Right(3). Проблема в том, что я не знаю, как конвертировать из CStringT в char[].CStringT to char []

Там должно быть очень простое решение, что я просто не реализующую ...

ТИА.

+2

Кто скажет, что все расширения имеют 3 символа? Вы должны найти последнее. (точка) и скопируйте остальную часть строки – Anders

+0

Это для коммерческого проекта. Все наши расширения - 3 символа. – Justin

+0

До того дня, когда они этого не делают. – jalf

ответ

4

Ну вы всегда можете сделать это даже в юникоде

char str[4]; 
strcpy(str, CStringA(cString.Right(3)).GetString()); 

Если вы знаете, что вы не используете юникод, то вы можете просто

char str[4]; 
strcpy(str, cString.Right(3).GetString()); 

Все исходный код блок делает ПЕРЕЧИСЛЕНИЕ последние 3 символа в строку un unicode (CStringA, CStringW определенно unicode и CStringT зависит от того, установлен ли параметр UNICODE), а затем получает строку как простую строку символов.

+0

Это похоже на лучшее решение для моего дела. Благодаря! – Justin

5

Если у вас есть доступ к ATL, который, как я полагаю, вы используете, если используете CString, вы можете посмотреть в ATL conversion classes, как CT2CA.

CString fileExt = _T ("txt"); 
CT2CA fileExtA (fileExt); 

Если преобразование должно быть выполнено (как при компиляции для Unicode), то CT2CA выделяет некоторую внутреннюю память и выполняет преобразование, уничтожая память в его деструкторе. Если компилировать для ANSI, преобразование не требуется, поэтому оно просто зависает с указателем на исходную строку. Он также обеспечивает неявное преобразование в const char *, поэтому вы можете использовать его как любую строку стиля C.

Это делает преобразования очень легкими, с оговоркой, что если вам нужно висеть на строке после того, как CT2CA выходит из области видимости, тогда вам нужно скопировать строку в буфер под вашим контролем (а не просто хранить указатель к нему). В противном случае CT2CA очищает преобразованный буфер, и у вас есть оборванная ссылка.

0

Первое использование CStringA, чтобы убедиться, что вы получаете char, а не wchar_t. Затем просто нарисуйте его (const char *), чтобы получить указатель на строку, и используйте strcpy или что-то похожее на копирование в пункт назначения.

Если вы полностью уверены, что вы всегда будете копировать 3-х символов, вы просто могли бы сделать это простой способ.

ext[0] = filename[filename.Length()-3]; 
ext[1] = filename[filename.Length()-2]; 
ext[2] = filename[filename.Length()-1]; 
ext[3] = 0; 
0

Я считаю, что это то, что вы ищете:

CString theString("This is a test"); 
char* mychar = new char[theString.GetLength()+1]; 
_tcscpy(mychar, theString); 

Если я помню свою старую школу MS C++.

+0

Это не будет компилироваться при определении UNICODE. _tcscpy требует два буфера TCHAR. Если UNICODE определен, вам необходимо выполнить фактическое преобразование набора символов с помощью WideCharToMultiByte. –

+0

А, справедливо. Прошло довольно много времени, так как я использовал ATL или MFC. –

0

Вы не указали, где тип CStringT из. Это может быть что угодно, включая вашу собственную реализацию класса обработки строк.Если предположить, что CStringT из MFC/библиотеки ATL доступны в Visual C++, у вас есть несколько вариантов:

Это не было сказано, если вы компилируете с или без Unicode, поэтому представление с использованием TCHAR не char:

CStringT 
    < 
    TCHAR, 
    StrTraitMFC 
     < 
     TCHAR, 
     ChTraitsCRT<TCHAR> 
     > 
    > file(TEXT("test.txt")); 

TCHAR* file1 = new TCHAR[file.GetLength() + 1]; 
_tcscpy(file1, file); 

Если вы используете CStringT, специализированный для строки ANSI, то

std::string file1(CStringA(file)); 
char const* pfile = file1.c_str(); // to copy to char[] buffer