[C] Error Conversión String to Char

Iniciado por MeCraniDOS, 31 Marzo 2013, 16:08 PM

0 Miembros y 1 Visitante están viendo este tema.

MeCraniDOS

Hola, estoy intentando hacer una aplicacion con VisualC++, y me tira un error en este trozo de codigo...

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {

FILE *Archivo;
char Nombre[10];
int celda;


strcpy(Nombre, AbrirArchivo->Text);
                //AbrirArchivo es un Textbox

Archivo = fopen(AbrirArchivo->Text, "wb");
if (Archivo != NULL)
{
Estado->Text = "Error: No se encuentra el archivo";
                        //Estado es otro Textbox
}
else
{
fclose(Archivo);
}


}
};


Los errores que me dan son estos:

Citarerror C2664: 'strcpy' : no se puede convertir el parámetro 2 de 'System::String ^' a 'const char *'

Citarerror C2664: 'fopen' : no se puede convertir el parámetro 1 de 'System::String ^' a 'const char *'

No se como hacer la conversión, así que a ver si alguien me puede echar una mano...  :silbar:

Saludos
"La física es el sistema operativo del Universo"
     -- Steven R Garman

avesudra

#1
¿Quizás así?:
private:
System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
{

   FILE *Archivo;
   char Nombre[10];
   int celda;


   strcpy(Nombre, (char*)Marshal::StringToHGlobalAnsi(AbrirArchivo->Text).ToPointer());
   //AbrirArchivo es un Textbox

   Archivo = fopen((char*)Marshal::StringToHGlobalAnsi(AbrirArchivo->Text).ToPointer(), "wb");//Esto lo veo poco lógico pues ya podrías hacer:
   //Archivo = fopen(Nombre, "wb");
   if (Archivo != NULL)
   {
       Estado->Text = "Error: No se encuentra el archivo";
       //Estado es otro Textbox
   }
   else
   {
       fclose(Archivo);
   }
}
};

Fuente: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.stringtohglobalansi.aspx
Regístrate en

MeCraniDOS

Cita de: avesudra en 31 Marzo 2013, 16:52 PM
¿Quizás así?:

Ahora me sale esto...

Citar

error C2653: 'Marshal' : no es un nombre de clase o espacio de nombres

error C2228: el operando izquierdo de '.ToPointer' debe tener class/struct/union

1>        el tipo es ''unknown-type''

error C3861: 'StringToHGlobalAnsi': no se encontró el identificador

error C2653: 'Marshal' : no es un nombre de clase o espacio de nombres

error C2228: el operando izquierdo de '.ToPointer' debe tener class/struct/union

1>        el tipo es ''unknown-type''

error C3861: 'StringToHGlobalAnsi': no se encontró el identificador

"La física es el sistema operativo del Universo"
     -- Steven R Garman

avesudra

Pues no sé, igual es porque no tiene esto:
Código (cpp) [Seleccionar]
using namespace System::Runtime::InteropServices;
Pero vamos que ya te digo que ni idea porque en el link que te he pasado lo hacen así:
Código (cpp) [Seleccionar]
using namespace System;
using namespace System::Runtime::InteropServices;

#include <iostream>                                                 // for printf


int main()
{
    // Create a managed string.
    String^ managedString = "Hello unmanaged world (from the managed world).";

    // Marshal the managed string to unmanaged memory.
    char* stringPointer = (char*) Marshal::StringToHGlobalAnsi(managedString ).ToPointer();

    printf("stringPointer = %s\n", stringPointer);

    // Always free the unmanaged string.
    Marshal::FreeHGlobal(IntPtr(stringPointer));

    return 0;
}
Regístrate en