2010-01-19 37 views
5

Estoy utilizando el creador de GUI de Visual C++ 2008 para crear una interfaz de usuario. Cuando se hace clic en un botón, se llama a la siguiente función. Se supone que el contenido crea un archivo y el nombre del archivo después del contenido del cuadro de texto "Textbox" con ".txt" al final. Sin embargo, eso me lleva a un error de conversión. Aquí está el código:Conversión de System :: String a Const Char *

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

Aquí está el error:?.

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 *'

¿Cómo puedo hacer una conversión para permitir que esto pase por

+0

hombre, lo hice este año atrás, y el recuerdo no puede en lo que el código lo escribí! – leppie

Respuesta

0

puede convertirlo en un CString y luego añadir la extensión a la que

hay una construida en CString constructor que permitirá a esta conversión suceda

Ejemplo:

CString(Textbox->Text) 

En su caso específico:

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

¿Alguna pista de por qué devuelve '' CString ': identificador no encontrado' cuando he incluido string.h? – Reznor

+0

CString es parte de las bibliotecas MFC. ¿El proyecto está utilizando MFC (supongo que no)? (Propiedades del proyecto/Propiedades de configuración/General/Uso de MFC) – Ruddy

+0

Si selecciono 'Usar MFC en una biblioteca estática', entonces aparece: 'Error de línea de comando D8016:'/MT 'y'/clr: pure 'opciones de línea de comando son incompatibles 'Lo siento, soy un poco principiante, y esto me irrita. – Reznor

7

yo usaría de clasificación:

Pero tenga en cuenta que a continuación, utilice simplemente Ansi instrumentos de cuerda. Si necesita compatibilidad con Unicode, puede usar la clase widelink STL wofstream y PtrToStringChars (#include <vcclr.h>) para convertir desde System::String. En ese caso, no necesita liberar el puntero clavado.

+0

Genial, ese fue el código que escribí! +1 – leppie

+1

+1 Exactamente lo que estoy escribiendo, excepto que prefiero static_cast ( Marshal :: StringToHGlobalAnsi (Textbox-> Text) .ToPointer()) –

+0

Buen punto James, ¡mejor usando moldes de C++ como usted sugiere! – 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

Gracias jdehaan. Poco modifiqué el código para usarlo con mi System :: String "normal".

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)); 
} 

De esta forma si desea convertir el sistema: String -> std: string.

7

¡Es simple!

Como estás usando manejado C++, utilice el include y funcionan como:

#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 
} 
Cuestiones relacionadas