Konwersja string to char Visual

0

Witam, mój problem wygląda następująco: pobieram od użytkownika różne wartości poprzez obiekt typu textBox1->Text a on jest jest typu String, jedną z danych pobieranych od użytkownika jest nazwa pliku jaki należy stworzyć

std::ofstream uczen(zmienna); 

Niestety Visual Studio wyrzuca błędy o tym aby zmienna była typu char, więc znalazłem w sieci taką fukncję która w sprytny sposób zamienia string na char. (Conwert::ToChar()- nie działa tzn wywala błędy)

char str1[20];
char* pString =(char*)System::Runtime::InteropServices::Marshal:: StringToHGlobalAnsi(plik->Text).ToPointer();
strncpy_s (str1,pString ,20); 

pytanie brzmi czy jest to optymalne rozwiązanie ? i w jaki sposób zbudować funckję gdzie jako parametr będziemy podawać łańcuch String a funkcja zwruci wartość char

pozdrawiam i czekam na jakiekolwiek odpowiedz

0

Nie musisz kopiować pString do osobnej tablicy. Tak że to str1 możesz całkowicie wyrzucić.
Pamiętaj że to co dostałeś ze StringToHGlobalAnsi musisz potem zwolnić przez FreeHGlobal.

#include "stdafx.h"
// zawiera #include <iostream>

using namespace std;
using namespace System;
using namespace System::Runtime::InteropServices;

int main(array<System::String ^> ^args)
{
    String ^str="ala ma kota";
    char *cstr=(char*)Marshal::StringToHGlobalAnsi(str).ToPointer();
    cout<<cstr<<endl;
    Marshal::FreeHGlobal((IntPtr)cstr); // koniecznie!
    Console::ReadKey();
}

alternatywnie możesz użyć klasy System::IO::File zamiast std::ofstream.

0

A czy mógłbyś wyjaśnić dlaczego muszę zwolnić wartość zmiennej poprzez FreeHGlobal ?

pozdrawiam

0

char* jest typem natywnym, który nie podlega automatycznemu odśmiecaniu. StringToHGlobalAnsi() przydziela za ciebie pamięć i zwraca wskaźnik, więc musisz go potem zwolnić.

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.