2010-01-19 18 views
5

मैं उपयोगकर्ता इंटरफ़ेस बनाने के लिए विजुअल सी ++ 2008 के जीयूआई निर्माता का उपयोग कर रहा हूं। जब कोई बटन क्लिक किया जाता है, तो निम्न फ़ंक्शन को कॉल किया जाता है। सामग्री को फ़ाइल बनाने और फ़ाइल को "टेक्स्टबॉक्स" की सामग्री के बाद फ़ाइल में '.txt' के साथ फ़ाइल का नाम दिया जाना चाहिए। हालांकि, यह मुझे एक रूपांतरण त्रुटि की ओर ले जाता है। यहां कोड है:कनवर्टिंग सिस्टम :: स्ट्रिंग टू कॉन्स्ट चार *

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

कोई संकेत यह क्यों लौट रहा है '' सीएसटींग ': पहचानकर्ता नहीं मिला' जब मैंने string.h शामिल किया है? – Reznor

+0

सीएसटींग एमएफसी पुस्तकालयों का हिस्सा है - एमएफसी का उपयोग कर प्रोजेक्ट है (मैं इसका अनुमान लगा रहा हूं)? (परियोजना गुण/कॉन्फ़िगरेशन गुण/सामान्य/एमएफसी का उपयोग) – Ruddy

+0

यदि मैं 'स्थिर पुस्तकालय में एमएफसी का उपयोग करें' का चयन करता हूं तो यह लौटाता है: 'कमांड लाइन त्रुटि D8016:'/MT 'और'/clr: pure 'कमांड लाइन विकल्प असंगत हैं 'क्षमा करें, मैं कुछ शुरुआत करने वाला हूं, और यह मुझे परेशान कर रहा है। – Reznor

7

मैं का प्रयोग करेंगे मार्शलिंग:

लेकिन ध्यान दें कि आप केवल अंसी का उपयोग करते हैं तार। यदि आपको यूनिकोड समर्थन की आवश्यकता है तो आप System::String से कनवर्ट करने के लिए विस्तृत एसटीएल कक्षा wofstream और PtrToStringChars (#include <vcclr.h>) का उपयोग कर सकते हैं। उस स्थिति में आपको पिन किए गए पॉइंटर को खाली करने की आवश्यकता नहीं है।

+0

कूल, वह कोड मैंने लिखा था! +1 – leppie

+1

+1 सटीक रूप से जो मैं लिखता हूं, सिवाय इसके कि मैं static_cast ( मार्शल :: स्ट्रिंगटोएचजीलोबलएन्सी (टेक्स्टबॉक्स-> टेक्स्ट) को पसंद करता हूं। टॉपोइंटर()) –

+0

गुड प्वाइंट जेम्स, सी ++ का उपयोग करते हुए बेहतर आपके सुझाव देते हैं! – 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

धन्यवाद jdehaan। मैंने अपने 'सामान्य' सिस्टम :: स्ट्रिंग के साथ इसका उपयोग करने के लिए कोड को थोड़ा संशोधित किया।

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

यह तरीका है यदि आप सिस्टम को परिवर्तित करना चाहते हैं: स्ट्रिंग -> std: string।

0

वहाँ स्ट्रिंग रूपांतरण के बारे में यहाँ MSDN में एक वास्तव में उत्कृष्ट लेख है:

http://msdn.microsoft.com/en-us/library/ms235631%28vs.80%29.aspx

कई नमूनों से और विभिन्न प्रकार के स्ट्रिंग कन्वर्ट करने के लिए कर रहे हैं।

7

यह आसान है!

#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 
} 
संबंधित मुद्दे