Потоки ввода/вывода. Класс 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