CStringT на символ [] - PullRequest
       9

CStringT на символ []

3 голосов
/ 06 августа 2009

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

Должно быть действительно простое решение, которое я просто не понимаю ...

ТИА.

Ответы [ 5 ]

5 голосов
/ 06 августа 2009

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

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

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

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

4 голосов
/ 06 августа 2009

Ну, вы всегда можете сделать это даже в Unicode

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

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

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

Все, что делает оригинальный блок кода, это переводит последние 3 символа в строку, отличную от Юникода (CStringA, CStringW определенно является юникодом, а CStringT зависит от того, задано ли определение UNICODE), а затем получает строку в виде простой строки символов.

0 голосов
/ 24 января 2010

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

Это не было сказано, если вы компилируете с Unicode или без, поэтому представьте с использованием TCHAR not 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
0 голосов
/ 06 августа 2009

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

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

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

0 голосов
/ 06 августа 2009

Сначала используйте 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;
...