我有一个函数(FOPEN在STL),让一个char *参数作为在我的电脑的路径,但我必须在那个地方使用QString,所以它不起作用。
如何将QString转换为char *来解决此问题?
我有一个函数(FOPEN在STL),让一个char *参数作为在我的电脑的路径,但我必须在那个地方使用QString,所以它不起作用。
如何将QString转换为char *来解决此问题?
见here at How can I convert a QString to char* and vice versa?
为了为QString转换为 的char *,那么你首先需要通过 得到字符串的 的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();
将使应用程序崩溃的 的QByteArray没有被储存和 因此不再存在
为char *转换为你 可以使用QString的构造函数 需要QLatin1String,如QString的:
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();
你可以使用QFile而不是的std :: fstream的。
QFile file(qString);
替代地,QString的转换成一个char *如下:
std::ifstream file(qString.toLatin1().data());
的QString是UTF-16,从而它被转换toLatin1()在这里,但QString的有几个不同的转换,包括toUtf8的()(检查你的文件系统可能使用UTF-8)。
正如上面的@ 0A0D所指出的那样:不要将char *存储在变量中,而不会获取QByteArray的本地副本。
char const* fileName = qString.toLatin1().data();
std::ifstream file(fileName); // fileName not valid here.
这是因为toLatin1()返回一个QByteArray对象。由于它实际上并未绑定到变量,因此它是在表达式末尾销毁的临时变量。因此,这里对data()的调用返回一个指向内部结构的指针,该内部结构在';'之后不再存在。
我认为措辞需要改变。声明'const char * c_str2 = str2.toLatin1()。data();'应该可以正常工作。不幸的是,';'由toLatin1()创建的临时QByteArray已被销毁,因此'c_str2'现在有一个无效指针。相反,你可以在调用'doStuff(str2.toLatin1()。data());'中使用它,因为QByteArray不会被销毁,直到';'因此:'printf(“str2:%s”,str2.toLatin1()。data());'应该可以。 – 2011-03-31 20:46:21
@Martin:我只是引用Qt。 – 2011-03-31 20:49:01
这个。今天我花了一半时间调试QByteArray被破坏引起的问题。必须存储字节数组真的很痛苦,但似乎是必要的。 – misha 2011-11-14 11:24:08