Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:

Если мы хотим выполнить чтение или запись за один шаг, мы не должны использовать QDataStream, а вместо этого мы должны вызывать функции write и readAll класса QIODevice. Например:

01 bool copyFile(const QString &source, const QString &dest)

02 {

03 QFile sourceFile(source);

04 if (!sourceFile.open(QIODevice::ReadOnly))

05 return false;

06 QFile destFile(dest);

07 if (!destFile.open(QIODevice::WriteOnly))

08 return false;

09 destFile.write(sourceFile.readAll);

10 return sourceFile.error == QFile::NoError

11 && destFile.error == QFile::NoError;

12 }

В

строке, где вызывается readAll, все содержимое входного файла считывается в QByteArray, который затем передается функции write для записи в выходной файл. Хранение всех данных в QByteArray ведет к большему расходу памяти, чем при последовательном чтении элементов, однако это дает некоторые преимущества. Например, мы можем затем использовать функции qCompress и qUncompress для упаковки и распаковки данных.

Существуют другие сценарии, когда прямой доступ к QIODevice оказывается более подходящим, чем использование QDataStream. Класс QIODevice имеет функцию peek, которая возвращает следующие байты данных, перемещая позицию устройства, а также функцию ungetChar, которая возвращает считанный байт в поток. Эти функции работают как на устройствах произвольного доступа (таких, как файлы), так и на последовательных устройствах (таких, как сетевые сокеты). Имеется также функция seek, которая используется для установки позиции устройств, поддерживающих произвольный доступ.

Двоичные форматы файлов являются наиболее универсальным и компактным средством хранения данных, a QDataStream позволяет легко получить доступ к двоичным данным. Кроме примеров в данном разделе мы уже видели в главе 4 , как QDataStream применяется для чтения и записи файлов в приложении Электронная таблица, и мы снова встретим этот класс в главе 19 , где он будет использоваться для чтения и записи файлов курсоров в системе Windows.

Чтение и запись текста

Хотя двоичные форматы файлов обычно более компактные, чем текстовые форматы, они плохо воспринимаются человеком и не могут им редактироваться. Там, где последнее играет важную роль, можно использовать текстовые форматы. Qt предоставляет класс QTextStream для чтения и записи простых текстовых файлов или файлов других текстовых форматов, например HTML, XML, и файлы исходных текстов программ. Работа с XML—файлами рассматривается отдельно в главе 15 .

QTextStream обеспечивает преобразование между Unicode и локальной кодировкой системы или любой другой кодировкой и незаметно для пользователя справляется с различными соглашениями относительно окончаний строк, принятыми в разных операционных системах («\r\n» в Windows, «\n» в Unix и Mac OS X). QTextStream

использует 16-битовый тип QChar в качестве основного элемента данных. Кроме символов и строк QTextStream поддерживает основные числовые типы С++, преобразуя их в строку и обратно. Например, в следующем фрагменте программного кода выполняется запись строки «Thomas M. Disch: 334\n» в файл sf-book.txt:

QFile file("sf-book.txt");

if (!file.open(QIODevice::WriteOnly)) {

cerr << "Cannot open file for writing: "

<< qPrintable(file.errorString) << endl;

return;

}

QTextStream out(&file);

out << "Thomas M. Disch: " << 334 << endl;

Записать текст очень просто, однако его чтение может оказаться трудной задачей, поскольку текстовый формат данных (в отличие от двоичного формата данных, записанных с помощью QDataStream) в принципе двусмысленный. Давайте рассмотрим следующий пример:

out << "Norway" << "Sweden";

Если out является объектом типа QTextStream, то данные в действительности записываются в виде строки «NorwaySweden». Мы не можем рассчитывать на то, что приведенная ниже строка правильно считает данные:

in >> str1 >> str2;

Фактически произойдет то, что строка str1 получит все слово «NorwaySweden», а строка str2 ничего не получит. При использовании класса QDataStream не возникнет таких трудностей, поскольку он сохраняет длину каждой строки в начале символьных данных.

Для сложных форматов файлов может потребоваться полнофункциональный парсер. Такой парсер мог бы считывать символ за символом при помощи оператора >> для типа QChar или строку за строкой при помощи функции QTextStream::readLine. В конце этого раздела мы представим два небольших примера, в одном из которых входной файл считывается построчно, а в другом он считывается посимвольно. Для того чтобы использовать парсеры, работающие с целым текстом, мы могли бы считать весь файл за один шаг, используя функцию QTextStream::readAll, если бы нас не волновал расход памяти или если бы мы знали, что файл будет небольшим.

По умолчанию QTextStream использует локальную кодировку системы (например, ISO 8859-1 или ISO 8859-15 в Америке и в большей части Европы) при чтении и записи. Это можно изменить, используя функцию setCodec:

stream.setCodec("UTF-8");

В этом примере используется кодировка UTF-8, совместимая с популярной кодировкой ASCII и позволяющая представить весь набор символов Unicode. Дополнительная информация о кодировке Unicode и о поддержке кодировок классом QTextStream приводится в главе 17 («Интернационализация»).

Поделиться:
Популярные книги

Барон играет по своим правилам

Ренгач Евгений
5. Закон сильного
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Барон играет по своим правилам

Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Клеванский Кирилл Сергеевич
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.51
рейтинг книги
Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Герцогиня в ссылке

Нова Юлия
2. Магия стихий
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Герцогиня в ссылке

Ну привет, заучка...

Зайцева Мария
Любовные романы:
эро литература
короткие любовные романы
8.30
рейтинг книги
Ну привет, заучка...

На Ларэде

Кронос Александр
3. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
На Ларэде

Сердце Дракона. Том 12

Клеванский Кирилл Сергеевич
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Сердце Дракона. Том 12

Истинная поневоле, или Сирота в Академии Драконов

Найт Алекс
3. Академия Драконов, или Девушки с секретом
Любовные романы:
любовно-фантастические романы
6.37
рейтинг книги
Истинная поневоле, или Сирота в Академии Драконов

Кодекс Охотника. Книга VI

Винокуров Юрий
6. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга VI

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Сама себе хозяйка

Красовская Марианна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Сама себе хозяйка

Душелов. Том 3

Faded Emory
3. Внутренние демоны
Фантастика:
альтернативная история
аниме
фэнтези
ранобэ
хентай
5.00
рейтинг книги
Душелов. Том 3

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Стеллар. Заклинатель

Прокофьев Роман Юрьевич
3. Стеллар
Фантастика:
боевая фантастика
8.40
рейтинг книги
Стеллар. Заклинатель

Возвышение Меркурия. Книга 5

Кронос Александр
5. Меркурий
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 5