Потоки ввода/вывода. Класс QTextStream


Объекты файлов, сами по себе, обладают только элементарными методами для чтения и записи информации. Использование потоков делает запись и считывание файлов более простым и гибким. Для файлов, содержащих текстовую информацию, следует использовать класс QTextStream, а для двоичных файлов — класс QDataStream.

Применение классов QTextStream и QDataStream такое же, как и для стандартного потока в языке C++ (iostream), с той лишь разницей, что они могут работать с объектами класса QIODevice. Благодаря этому, потоки можно использовать и для своих собственных классов, унаследованных от QIODevice.

Для записи данных в поток используется оператор <<, а для чтения данных из потока — >>.

Класс QTextStream

Класс QTextStream предназначен для чтения текстовых данных. В качестве текстовых данных могут выступать не только объекты, произведенные классами, унаследованными от QIODevice, но и переменные типов char, QChar, char*, QString, QByteArray, short, int, long, float и double. Числовые данные, передаваемые в поток, автоматически преобразуются в текст. Можно управлять форматом их преобразования, например, метод 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;
    }
    if(stream.status()!= QTextStream::Ok)
    {
        qDebug() << "Ошибка чтения файла";
    }
    file.close();
}

Методом QTextStream::readAll() можно считать сразу весь текстовый файл в строку.

Например:


QFile file("myfile.txt");
QTextStream stream(&file);
QString str = stream.readAll();

Чтобы записать текстовую информацию в файл, необходимо создать объект класса QFile и воспользоваться оператором <<. Перед записью можно провести необходимые преобразования строки. Например:


QFile file("file.txt");
QString str = "This is a test";
if (file.open(QIODevice::WriteOnly))
{
    QTextStream stream(&file);
    stream << str.toUpper(); //Запишет-THIS IS A TEST
    file.close();
    if (stream.status() != QTextStream::Ok)
    {
        qDebug() << "Ошибка записи файла";
    }
}

Класс QTextStream создавался для записи и чтения только текстовых данных, поэтому двоичные данные при записи будут искажены. Для чтения и записи двоичных данных без искажений следует пользоваться классом QDataStream.

Читать далее: Класс QDataStream