Шаг 88.
Библиотека Qt.
Ввод-вывод. Класс QIODevice

    На этом шаге рассмотрим класс QIODevice.

    Класс QIODevice — это абстрактный класс, обобщающий устройство ввода-вывода, который содержит виртуальные методы для открытия и закрытия устройства ввода-вывода, а также для чтения и записи блоков данных или отдельных символов.

    Реализация конкретного устройства происходит в унаследованных классах. В Qt есть четыре класса, наследующих класс QIODevice (рис. 1):


Рис.1. Иерархия классов ввода-вывода

    Для работы с устройством его необходимо открыть в одном из режимов, определенных в заголовочном файле класса QIODevice:

    Для того чтобы в любой момент времени исполнения программы узнать, в каком из режимов было открыто устройство, нужно вызвать метод openMode().

    Считывать и записывать данные можно с помощью методов read() и write(). Для чтения всех данных сразу определен метод readAll(), который возвращает их в объекте типа QByteArray. Строку или символ можно прочитать методами readLine() и getChar() соответственно.

    В классе QIODevice определен метод для смены текущего положения seek(). Получить текущее положение можно вызовом метода pos(). Но не забывайте, что эти методы применимы только для прямого доступа к данным. При последовательном доступе, каким является сетевое соединение, они теряют смысл. Более того, в этом случае теряет смысл и метод size(), возвращающий размер данных устройства. Все эти операции применимы только для классов QFile, QBuffer и QTemporaryFile.

    Для создания собственного класса устройства ввода-вывода, для которого Qt не предоставляет поддержки, необходимо унаследовать класс QIODevice и реализовать в нем методы readData() и writeData(). В большинстве случаев может потребоваться переопределить методы open(), close() и atEnd().

    Благодаря интерфейсу класса QIODevice можно работать со всеми устройствами одинаково, и при работе обычно не имеет значения, является ли устройство файлом, буфером или другим устройством. Например, с помощью такого метода можно выводить на консоль данные из любого устройства:

void print(QIODevice* pdev)
{
char ch;
QString str;
pdev->open(QIODevice::ReadOnly);
for (; !pdev->atEnd();) {
pdev->getChar(&ch);
str += ch;
}
pdev->close();
qDebug() << str;
}

    На рис. 2 приведен пример использования данной функции для вывода содержимого файла.


Рис.2. Вывод содержимого файла

    Файлы приложения можно взять здесь.

    Класс QIODevice предоставляет ряд методов, с помощью которых можно получить информацию об устройстве ввода-вывода. Например, одни устройства могут только записывать информацию, другие — только считывать, а третьи способны делать и то, и другое. Чтобы проверить, какие операции доступны при работе с устройством, следует воспользоваться методами isReadable() и isWriteable().

    На следующем шаге рассмотрим методы работы с файлами. Описание этих методов содержится в классе QFile.




Предыдущий шаг Содержание Следующий шаг