【发布时间】:2011-07-27 04:30:35
【问题描述】:
我有一个函数(在 STL 中为 fopen),它在我的计算机中提供一个 char* 参数作为路径,但我必须在那个地方使用 QString,所以它不起作用。
如何将 QString 转换为 char* 来解决这个问题?
【问题讨论】:
我有一个函数(在 STL 中为 fopen),它在我的计算机中提供一个 char* 参数作为路径,但我必须在那个地方使用 QString,所以它不起作用。
如何将 QString 转换为 char* 来解决这个问题?
【问题讨论】:
见here at How can I convert a QString to char* and vice versa?
为了将 QString 转换为 char*,那么你首先需要得到一个 字符串的 latin1 表示 在其上调用 toLatin1() 将 返回一个 QByteArray。然后调用 data() 在 QByteArray 上获取指向的指针 存储在字节数组中的数据。看 文档:
https://doc.qt.io/qt-5/qstring.html#toLatin1 https://doc.qt.io/qt-5/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(); }请注意,必须存储 调用 data() 之前的字节数组 它,像下面这样的调用
const char *c_str2 = str2.toLatin1().data();会使应用程序崩溃 QByteArray 尚未存储且 因此不再存在
要将 char* 转换为 QString,您 可以使用 QString 构造函数 接受一个QLatin1String,例如:
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();
【讨论】:
const char *c_str2 = str2.toLatin1().data(); 应该可以正常工作。不幸的是在';'之后toLatin1() 创建的临时 QByteArray 已被销毁,因此 c_str2 现在有一个无效指针。相反,您可以在调用 doStuff(str2.toLatin1().data()); 中使用它,因为 QByteArray 直到 ';' 才会被销毁因此:printf("str2: %s", str2.toLatin1().data()); 应该没问题。
您可以使用 QFile 而不是 std::fstream。
QFile file(qString);
或者将 QString 转换为 char*,如下所示:
std::ifstream file(qString.toLatin1().data());
QString 采用 UTF-16 格式,因此在此处转换为 Latin1(),但 QString 有几个不同的转换,包括 toUtf8()(检查您的文件系统,它可能使用 UTF-8)。
正如上面@0A0D 所指出的:不要将 char* 存储在变量中,而不获取 QByteArray 的本地副本。
char const* fileName = qString.toLatin1().data();
std::ifstream file(fileName); // fileName not valid here.
这是因为 toLatin1() 返回一个 QByteArray 的对象。由于它实际上并未绑定到变量,因此它是在表达式末尾被销毁的临时变量。因此,此处对 data() 的调用返回一个指向内部结构的指针,该结构在 ';' 之后不再存在。
【讨论】: