上一节我们介绍了有关二进制文件的读写。二进制文件比较小巧,却不是人可读的格式。而文本文件是一种人可读的文件。为了操作这种文件,我们需要使用QTextStream类。QTextStream和QDataStream的使用类似,只不过它是操作纯文本文件的。
QTextStream会自动将 Unicode 编码同操作系统的编码进行转换,这一操作对开发人员是透明的。它也会将换行符进行转换,同样不需要自己处理。QTextStream使用 16 位的QChar作为基础的数据存储单位,同样,它也支持 C++ 标准类型,如 int 等。实际上,这是将这种标准类型与字符串进行了相互转换。
QTextStream同QDataStream的使用基本一致。
mywidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class MyWidget; }
QT_END_NAMESPACE
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget *parent = nullptr);
~MyWidget();
void writeData();
void readData();
private:
Ui::MyWidget *ui;
};
#endif // MYWIDGET_H
mywidget.cpp
#include "mywidget.h"
#include "ui_mywidget.h"
#include<QTextStream>
#include<QFile>
#include<QDebug>
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MyWidget)
{
ui->setupUi(this);
this->writeData();
this->readData();
}
MyWidget::~MyWidget()
{
delete ui;
}
void MyWidget::writeData()
{
QFile file;
file.setFileName("../09_QTextStream/demo.txt");
bool isOK=file.open(QIODevice::WriteOnly);
if(true==isOK)
{
QTextStream stream(&file);
//指定编码方式
stream.setCodec("UTF-8");
stream<<QString("啦啦啦啦")<<666;
file.close();
}
}
void MyWidget::readData()
{
QFile file;
file.setFileName("../09_QTextStream/demo.txt");
bool isOK=file.open(QIODevice::ReadOnly);
if(true==isOK)
{
QTextStream stream(&file);
//指定编码方式
stream.setCodec("UTF-8");
QString str;
int a;
stream>>str>>a;
qDebug()<<str.toUtf8().data()<<a;
file.close();
}
}
结果:
发现结果a并不是想象中的666,而是0.
原因分析:
为当使用QDataStream写入的时候,实际上会在要写入的内容前面,额外添加一个这段内容的长度值。而以QTextStream写入数据,是没有数据之间的分隔的。
因此,使用QTextStream时,很少会将其分割开来读取,而是使用诸如使用:
QTextStream::readLine() 读取一行
QTextStream::readAll()读取所有文本
这种函数之后再对获得的QString对象进行处理。