2011-03-31 17 views
20

संभव डुप्लिकेट:
QString to char conversionपरिवर्तित QString चार करने के लिए *

मैं एक समारोह (एसटीएल में fopen) है कि एक चार * अपने कंप्यूटर में एक मार्ग के रूप में तर्क देता है, लेकिन मैं उस स्थान पर क्यूस्ट्रिंग का उपयोग करना चाहिए ताकि यह काम न करे।

इस समस्या को हल करने के लिए मैं QString को char * में कैसे परिवर्तित कर सकता हूं?

उत्तर

44

देखें here at How can I convert a QString to char* and vice versa?

आदेश में एक चार * करने के लिए एक QString बदलने के लिए है, तो आप पहले की जरूरत तार का एक latin1 प्रतिनिधित्व द्वारा उस पर toLatin1() कॉल जो एक वापस आ जाएगी पाने के लिए QByteArray। फिर बाइट सरणी में संग्रहीत डेटा पर पॉइंटर प्राप्त करने के लिए QByteArray पर डेटा() पर कॉल करें। देखें प्रलेखन:

http://qt.nokia.com/doc/qstring.html#toLatin1 http://qt.nokia.com/doc/qbytearray.html#data

एक प्रदर्शन के लिए निम्नलिखित उदाहरण देखें:

int main(int argc, char **argv) 
{ 
QApplication app(argc, argv); 
    QString str1 = "Test"; 
    QByteArray ba = str1.toLatin1(); 
    const char *c_str2 = ba.data(); 
    printf("str2: %s", c_str2); 
    return app.exec(); 
} 

ध्यान दें कि यह bytearray स्टोर करने के लिए इससे पहले कि आप पर डेटा() फोन के लिए आवश्यक है यह, निम्नलिखित

const char *c_str2 = str2.toLatin1().data(); 
जैसे कॉल 363,210

अनुप्रयोग क्रैश कर देगा के रूप में QByteArray संग्रहीत नहीं किया गया है और इसलिए नहीं रह गया है

मौजूद एक QString आप QString निर्माता कि एक QLatin1String लेता है, जैसे उपयोग कर सकते हैं करने के लिए एक चार * बदलने के लिए:

http://qt.nokia.com/doc/qlatin1string.html

:
QString string = QString(QLatin1String(c_str2)) ; 

दस्तावेज़ देखें बेशक

, मुझे पता चला है कि इस previous SO answer से एक और तरीका है:

QString qs; 

// Either this if you use UTF-8 anywhere 
std::string utf8_text = qs.toUtf8().constData(); 

// or this if you on Windows :-) 
std::string current_locale_text = qs.toLocal8Bit().constData(); 
+8

मुझे लगता है कि शब्द बदलने की जरूरत है। कथन 'const char * c_str2 = str2.toLatin1() डेटा();' ठीक काम करना चाहिए। दुर्भाग्य से ';' के बाद toLatin1() द्वारा निर्मित अस्थायी QByteArray को नष्ट कर दिया गया है, इसलिए अब c_str2' में एक अमान्य सूचक है। इसके विपरीत आप इसे 'doStuff (str2.toLatin1() डेटा()) में उपयोग कर सकते हैं;' QByteArray को ';' तक नष्ट नहीं किया जाता है इस प्रकार: 'printf (" str2:% s ", str2.toLatin1() डेटा()); 'ठीक होना चाहिए। –

+0

@ मार्टिन: मैं सिर्फ क्यूटी उद्धृत कर रहा हूं। –

+1

यह। मैंने आजकल आधा क्यूबाइटएरे नष्ट होने की वजह से एक समस्या को डीबग करने में बिताया है। बाइट सरणी को स्टोर करना एक वास्तविक दर्द है, लेकिन ऐसा लगता है कि यह आवश्यक है। – misha

1

आप QFile बजाय std :: fstream इस्तेमाल कर सकते हैं।

QFile   file(qString); 

वैकल्पिक रूप से एक चार में QString परिवर्तित * इस प्रकार है:

std::ifstream file(qString.toLatin1().data()); 

QString में है UTF-16 तो यह बदल जाती है toLatin1() यहाँ लेकिन QString toUtf8 सहित विभिन्न रूपांतरण की एक जोड़ी है() (अपनी फाइल-सिस्टम जांचें जो यह यूटीएफ -8 का उपयोग कर सकता है)।

जैसा कि ऊपर @ 0 ए0 डी द्वारा नोट किया गया है: क्यूबीटेएरे की स्थानीय प्रति प्राप्त किए बिना char * को एक चर में स्टोर करें।

char const*  fileName = qString.toLatin1().data(); 
std::ifstream file(fileName); // fileName not valid here. 

ऐसा इसलिए है क्योंकिLatin1() QByteArray का ऑब्जेक्ट देता है। चूंकि यह वास्तव में एक चर के लिए बाध्य नहीं है, यह एक अस्थायी है जो अभिव्यक्ति के अंत में नष्ट हो जाता है। इस प्रकार डेटा() पर कॉल एक आंतरिक संरचना में एक सूचक लौटाता है जो ';' के बाद मौजूद नहीं है।

संबंधित मुद्दे