|
Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке? Тип приложения - не 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 ! ";
}