На этом шаге рассмотрим класс QTextStream.
Класс QTextStream предназначен для чтения текстовых данных. В качестве текстовых данных могут выступать не только объекты, созданные классами, унаследованными от QIODevice, но и переменные типов char, QChar, char*, QString, QByteArray, short, int, long, float и double. Пример использования объекта класса QTextStream приведен в шаге 86.
Числовые данные, передаваемые в поток, автоматически преобразуются в текст. Можно управлять форматом их преобразования, например метод QTextStream::setRealNumberPrecision() задает количество знаков после запятой. Этот класс следует использовать для считывания и записи текстовых данных в формате Unicode. Чтобы считать текстовый файл, необходимо создать объект типа QFile и считать данные методом QTextStream::readLine(). Например:
QFile file("file.txt"); if (file.open(QIODevice::ReadOnly)) { QTextStream stream(&file); QString str; while (!stream.atEnd()) { str = stream.readLine(); qDebug() << str; } //если status() не вернул статус, указывающий на то, что //объект класса QTextStream работает нормально if (stream.status() != QTextStream::Ok) { qDebug() << "Ошибка чтения файла"; } file.close(); }
Файлы приложения можно взять здесь.
Результат работы приложения приведен на рисунке 1.
Рис.1. Вывод содержимого файла по строкам
Методом QTextStream::readAll() можно считать сразу весь текстовый файл в строку. Например:
QFile file("file.txt"); if (file.open(QIODevice::ReadOnly)) { QTextStream stream(&file); QString str = stream.readLine(); qDebug() << str; if (stream.status() != QTextStream::Ok) { qDebug() << "Ошибка чтения файла"; } file.close(); }
Файлы приложения можно взять здесь.
Результат работы приложения приведен на рисунке 2.
Рис.2. Вывод содержимого файла целиком
Чтобы записать текстовую информацию в файл, необходимо создать объект класса QFile и воспользоваться оператором <<. Перед записью можно провести необходимые преобразования строки. Например:
QFile file("file.txt"); QString str = "QTextStream stream(&file);"; if (file.open(QIODevice::WriteOnly)) { QTextStream stream(&file); qDebug() << "Запись строки " << str << "в файл. \nСтрока будет записана заглавными буквами."; stream << str.toUpper(); file.close(); if (stream.status() != QTextStream::Ok) { qDebug() << "Ошибка записи файла"; } } qDebug() << "Содержимое файла FILE.TXT"; if (file.open(QIODevice::ReadOnly)) { QTextStream stream(&file); str = stream.readLine(); qDebug << str; if (stream.status() != QTextStream::Ok) { qDebug() << "Ошибка чтения файла"; } file.close(); }
Файлы приложения можно взять здесь.
Результат работы приложения приведен на рисунке 3.
Рис.3. Запись строки в файл
Класс QTextStream создавался для записи и чтения только текстовых данных, поэтому двоичные данные при записи будут искажены. Для чтения и записи двоичных данных без искажений следует пользоваться классом QDataStream.
На следующем шаге рассмотрим класс QDataStream.