Я пытаюсь использовать libXl для вывода текста из программы на C ++ в файл Excel.
Проблема идет с этой библиотечной функцией:
bool writeStr(int row, int col, const wchar_t* value, Format* format = 0)
Записывает строку в ячейку с указанным форматом. Если формат равен 0
тогда формат игнорируется. Строка копируется внутри и может быть
уничтожено после вызова этого метода. Возвращает false, если произошла ошибка. Получить
информация об ошибке с помощью Book :: errorMessage ().
Если я даю ввод в виде строкового литерала, например «Hello World», он отображается правильно. Однако, если я попытаюсь ввести input как переменную типа const char *, она отобразит мусор.
Ниже мой код. MyCompany::company
это QString
,
const char* companyName = MyCompany::company.toStdString().c_str();
sheet->writeStr(4, 0, companyName, companyFormat);
Кто-нибудь может сказать мне, что происходит? Как я могу отобразить переменную строку с помощью этой библиотеки?
Спасибо за вашу помощь.
const char* companyName = MyCompany::company.toStdString().c_str();
Проблема здесь в том, что буфер companyName
указывает на становится недействительным сразу после окончания этого оператора, так как c_str () становится недействительным, когда временная std :: string, возвращаемая toStdString () уничтожается. Вы можете решить эту проблему, сохранив std :: string достаточно долго:
const std::string companyName = MyCompany::company.toStdString(); //survives until the end of the block
sheet->writeStr(4, 0, companyName.c_str(), companyFormat);
Я бы посоветовал не конвертировать через std :: string, а вместо этого конвертировать в определенную кодировку. Например UTF-8:
const QByteArray companyName = MyCompany::company.toUtf8();
sheet->writeStr(4, 0, companyName.constData(), companyFormat);
(Обратите внимание, что const char* companyName = MyCompany::company.toUtf8().constData()
будет иметь ту же проблему, что и ваш код выше).
Других решений пока нет …