Подтвердить что ты не робот

Преобразование QString в char *

Возможный дубликат:
Преобразование QString в char

У меня есть функция (fopen в STL), которая дает аргумент char * как путь на моем компьютере, но я должен использовать QString в этом месте, чтобы он не работал.

Как я могу преобразовать QString в char * для решения этой проблемы?

4b9b3361

Ответ 1

См. здесь. Как преобразовать QString в char * и наоборот?

Чтобы преобразовать 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, вы может использовать конструктор QString, который принимает QLatin1String, например:

QString string = QString(QLatin1String(c_str2)) ;

См. документацию:

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

Конечно, я обнаружил, что есть другой путь от этого предыдущего SO-ответа:

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

Ответ 2

Вы можете использовать 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() возвращает указатель на внутреннюю структуру, которая больше не существует после ';'.