На этом шаге рассмотрим класс 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.