Usted podría utilizar QFile en lugar de std :: fstream.
QFile file(qString);
convertir Alternativamente, el QString en un char * como sigue:
std::ifstream file(qString.toLatin1().data());
El QString es en UTF-16 toLatin1 por lo que se convierte() aquí, pero QString tiene un par de diferentes conversiones incluyendo toUtf8() (verifique su sistema de archivos puede usar UTF-8).
Según lo observado por @ 0A0D anterior: no almacene el char * en una variable sin obtener también una copia local de QByteArray.
char const* fileName = qString.toLatin1().data();
std::ifstream file(fileName); // fileName not valid here.
Esto es porque toLatin1() devuelve un objeto de QByteArray. Como en realidad no está vinculado a una variable, es un temporal que se destruye al final de la expresión. Por lo tanto, la llamada a data() aquí devuelve un puntero a una estructura interna que ya no existe después del ';'.
Creo que la redacción debe cambiar. La sentencia 'const char * c_str2 = str2.toLatin1(). Data();' debería funcionar bien. Desafortunadamente después del ';' el QByteArray temporal creado por toLatin1() se ha destruido, por lo que 'c_str2' ahora tiene un puntero no válido. Por el contrario, podría usarlo en una llamada 'doStuff (str2.toLatin1(). Data());' ya que QByteArray no se destruye hasta que ';' Por lo tanto: 'printf (" str2:% s ", str2.toLatin1(). Data());' Debería estar bien. –
@Martin: solo estoy citando a Qt. –
Esto. Pasé la mitad de hoy depurando un problema causado por la destrucción del QByteArray subyacente. Es un verdadero dolor tener que almacenar la matriz de bytes, pero parece ser necesario. – misha