2010-01-19 4 views
5

Я использую Visual C++ 2008 для создания пользовательского интерфейса. Когда нажимается кнопка, вызывается следующая функция. Содержимое должно создать файл и назовите файл после содержимого текстового поля «Текстовое поле» с «.txt» в конце. Однако это приводит меня к ошибке преобразования. Вот код:Converting System :: String to Const Char *

private: System::Void Button_Click(System::Object^ sender, System::EventArgs^ e) { ofstream myfile (Textbox->Text + ".txt"); myfile.close(); }

Здесь ошибка:.

error C2664: 'std::basic_ofstream<_Elem,_Traits>::basic_ofstream(const char *,std::ios_base::openmode,int)' : cannot convert parameter 1 from 'System::String ^' to 'const char *'

Как я могу сделать преобразование, чтобы позволить этому пройти через

+0

Люди, я сделал это много лет назад, и не может вспомнить, в какой код я написал! – leppie

ответ

0

Вы можете преобразовать его в CString, а затем добавить расширение к нему

Существует встроенный CString конструктор, который позволит это преобразование произойдет

Пример:

CString(Textbox->Text) 

В вашем конкретном случае:

private: System::Void Button_Click(System::Object^ sender, System::EventArgs^ e) 
{ 
    ofstream myfile (CString(Textbox->Text) + ".txt"); 
    myfile.close(); 
} 
+0

Любой ключ, почему он возвращает 'CString': идентификатор не найден ', когда я включил string.h? – Reznor

+0

CString является частью библиотек MFC - это проект с использованием MFC (я предполагаю, что это не так)? (Свойства проекта/Свойства конфигурации/Общие/Использование MFC) – Ruddy

+0

Если я выбираю «Использовать MFC в статической библиотеке», он возвращает: «Ошибка командной строки D8016:«/MT »и«/clr: pure »параметры командной строки несовместимы «Извините, я немного новичок, и это раздражает меня. – Reznor

7

Я хотел бы использовать сортировочных:

Обратите внимание, что вы используете только Ansi строки. Если вам нужна поддержка unicode, вы можете использовать широкополосный STL-класс wofstream и PtrToStringChars (#include <vcclr.h>) для преобразования из System::String. В этом случае вам не нужно освобождать закрепленный указатель.

+0

Прохладный, это был код, который я написал! +1 – leppie

+1

+1 Точно то, что я пишу, кроме того, что я предпочитаю static_cast ( Маршал :: StringToHGlobalAnsi (Текстовое поле-> Текст) .ToPointer()) –

+0

Хорошая точка Джеймс, лучше использовать C++, как вы предлагаете! – jdehaan

3
#include <string> 
#include <iostream> 
#include <atlbase.h> 
#include <atlconv.h> 
#include <vcclr.h> 

using namespace System; 

int main(array<System::String ^> ^args) 
{ 
    String^ managedStr = gcnew String(L"Hello, Managed string!"); 
    //If you want to convert to wide string 
    pin_ptr<const wchar_t> wch = PtrToStringChars(managedStr); 
    std::wstring nativeWstr(wch); 
    //if you want to convert to std::string without manual resource cleaning 
    std::string nativeStr(CW2A(nativeWstr.c_str())); 
    std::cout<<nativeStr<<std::endl; 
    Console::WriteLine(L"Hello World"); 
    return 0; 
} 
1

Thanks jdehaan. Я немного изменил код, чтобы использовать его с моей «обычной» System :: String.

void MarshalNetToStdString(System::String^ s, std::string& os) 
{ 
    using System::IntPtr; 
    using System::Runtime::InteropServices::Marshal; 

    const char* chars = (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer(); 
    os = chars; 
    Marshal::FreeHGlobal(IntPtr((void*)chars)); 
} 

Это путь действия, если вы хотите конвертировать: String -> std: string.

7

Это просто!

Как вы используете управляемый C++, использовать, включают и работают как:

#include <msclr/marshal.h> 

... 

void someFunction(System::String^ oParameter) 
{ 
    msclr::interop::marshal_context oMarshalContext; 

    const char* pParameter = oMarshalContext.marshal_as<const char*>(oParameter); 

    // the memory pointed to by pParameter will no longer be valid when oMarshalContext goes out of scope 
} 
Смежные вопросы