Ввод-вывод. Класс QIODevice

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

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

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


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

  • QFile — класс для проведения операций с файлами;
  • QBuffer — класс буфера, который позволяет записывать и считывать данные в массив QByteArray, как будто бы это устройство или файл;
  • QAbstractSocket — базовый класс для сетевой коммуникации посредством сокетов;
  • QProcess — класс, предоставляющий возможность запуска процессов с дополнительными аргументами и позволяющий обмениваться информацией с этими процессами посредством методов, определенных в QIODevice.

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

  • QIODevice::NotOpen — устройство не открыто (это значение не имеет смысла передавать в метод open());
  • QIODevice::ReadOnly — открытие устройства только для чтения данных;
  • QIODevice::WriteOnly — открытие устройства только для записи данных;
  • QIODevice::ReadWrite — открытие устройства для чтения и записи данных (то же, что ReadOnly | WriteOnly);
  • QIODevice::Append — открытие устройства для добавления данных;
  • QIODevice::Unbuffered — открытие для непосредственного доступа к данным, в обход промежуточных буферов чтения и записи;
  • QIODevice::Text — применяется для преобразования символов переноса строки в зависимости от платформы. В ОС Windows используется комбинация "r\n", а в MacOS X и Unix — "\r";
  • QIODevice::Truncate — все данные устройства, по возможности, должны быть удалены при открытии.

   
Для того чтобы в любой момент времени исполнения программы узнать, в каком из режимов было открыто устройство, нужно вызвать метод 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. Вывод содержимого файла

   
Файлы приложения можно взять Предыдущий шаг
Содержание
Следующий шаг



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий