Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке? Тип приложения - не Qt, Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.
|
Структура проекта. Основные типы
12.6 Работа с файлами
Инструментарий Qt содержит большое количество средств, которые позволяют разработчику абстрагироваться от деталей реализации на той или иной программной платформе. В этом разделе мы рассмотрим средства, Qt предоставляет для работы с файловой системой.
Все устройства ввода/вывода в Qt наследуют от абстрактного класса QIODevice. Среди его потомков: буфер для данных (QBuffer), процесс — программа которая выполняется в системе (QProcess), сетевой сокет (QAbstractSocket) и другие. Мы же подробно рассмотрим работу с другим его потомком — классом для работы с файлом (QFile).
Для работы с файлом необходимо создать объект класса QFile и задать для него путь к файлу (абсолютный или относительный), с которым вы будете работать. Путь и имя передают как параметр конструктора или с помощью метода setFileName().
Далее файл необходимо открыть и задать режим доступа к нему. Метод open()принимает флаги доступа и возвращает true, если файл удалось открыть. Доступные флаги доступа:
- QIODevice::ReadOnly — открыть для чтения;
- QIODevice::WriteOnly — открыть для записи;
- QIODevice::ReadWrite — открыть для чтения и записи;
- QIODevice::Append — все данные будут добавляться в конец файла (после уже существующих данных);
- QIODevice::Truncate — если возможно, стереть содержимое файла перед открытием;
- QIODevice::Text — режим работы с текстовым файлом (важно для текстовых файлов для корректной обработки символов завершения строки в Windows и Linux).
Флаги (класс QFlags) часто используют в Qt для задания комбинации настроек. Для комбинации нескольких настроек, так же как и бинарной арифметике, используют операцию побитового OR.
Для записи и чтения используют методы read() и write(), которые перегружены в нескольких вариантах. Для чтения одной строки текстового файла используют метод readLine(). Для чтения всего содержимого можно воспользоваться методом readAll(). Текущую позицию при чтении из файла определяют с помощью метода pos(). Установить позицию можно с помощью метода seek(). Метод atEnd() позволяет определить достигли ли мы конца файла при чтении. После завершения работы с файлом его нужно закрыть вызовом метода close(). Следующий пример демонстрирует чтение текстового файла и вывод его в консоль.
#include <QDebug> #include <QFile> int main ( int arg c, char * argv [ ] ) { const QString lFileName ( " file.txt " ); //Проверяем существование файла if ( ! QFile::exists ( lFileName ) ) { qCritical ( " File % s does not exists." , qPrintable ( lFileName ) ); return 1; } QFile lFile; //Устанавливаем имя файла lFile.setFileName ( lFileName ); //Открываем файл — текстовый, только для чтения if ( ! lFile.open ( QIODevice::ReadOnly | QIODevice::Text ) ) { //Если открыть файл не удалось — выводим сообщение об ошибке qCritical ( " Error % d : % s.", lFile.error ( ) , qPrintable ( lFile.errorString ( ) ) ); return 2; } //Пока можно прочесть строку while ( ! lFile.atEnd ( ) ) { // ... выводить её в консоль qDebug ( ) << lFile.readLine ( ); } //Заканчиваем работу с файлом lFile.close ( ); return 0; }
Рассмотрим работу с файлами в Qt на другом примере записи и чтения текстовой информации. В этом примере мы используем класс QTextStream для получения введённой пользователем информации в стандартный поток ввода. Конструктор QTextStream может принимать в качестве параметра указатель на потомок QIODevicе, указатель на QString или QByteArray, а также файловую переменную. В примере мы перенаправляем поток ввода в QТextStream. Далее мы читаем строку из потока ввода и записываем её в файл.
#include <QDebug> #include <QIODevice> #include <QFile> #include <QTextStream> int main ( int lArg c, char * lArgv [ ] ) { QTextStream in ( stdin ); QFile lFile ( " in.txt " ); if ( lFile.open ( QIODevice::WriteOnly | QIODevice::Truncate ) ) { QString lData = in.readLine ( ); lFile.write ( qPrintable ( lData ) ); lFile.close ( ); } else { qDebug ( ) << " Cannot open file ! "; } return 0; }
В следующем фрагменте демонстрируем обратный процесс — чтение строки из файла и вывод прочитанного строки в консоль. Опять же для чтения из файла мы используем QTextStream.
QFile lFile ( " in.txt " ); if ( lFile.open ( QIODevice::ReadOnly | QIODevice::Truncate ) ) { QTextStream in (&lFile ); QString lData = in.readLine ( ); qDebug ( ) << lData; lFile.close ( ); } else { qDebug ( ) << " Cannot open file ! "; }