如下图1所示文件读写测试用例,包括了文本文件的读写和二进制文件的读写功能,打开文件为读文件的过程,保存文件为写文件过程。
图1 文件读写测试用例图
文本文件是指以纯文本格式存储的文件,例如用 QT 编写的C++程序的头文件(上文件)和源程序文件(.cpp 文件)。HTML 和 XML 文件也是纯文本文件,使用文本编辑器打开该文件可以编辑和查看该文件内容。
QFile提供了从文件中读取和写入数据的能力。我们通常会将文件路径作为参数传给QFile的构造函数。不过也可以在创建好对象后使用setFileName()来修改。
void Widget::on_Button_QfileOpen_clicked()
{
//通过文件对话框打开获取文件路径
QString path = QFileDialog::getOpenFileName(this, "打开", "../", "TXT(*.TXT)");
if (path.isEmpty() == false)
{
QFile file(path);
bool b_open = file.open(QIODevice::ReadOnly);
if (b_open == true)
{
QByteArray arr;
arr = file.readAll();
//字节数组QByteArray->QString转换
ui->textEdit->setText(QString(arr)); //QFile只支持UTF-8格式
}
file.close();
}
}
void Widget::on_Button_QfileSave_clicked()
{
//通过文件对话框打开获取文件路径
QString path = QFileDialog::getOpenFileName(this, "保存", "../", "TXT(*.TXT)");
if (path.isEmpty() == false)
{
QFile file;
//关联文件名字
file.setFileName(path);
bool b_open = file.open(QIODevice::WriteOnly);
if (b_open == true)
{
//QFile只支持UTF-8格式
QString str = ui->textEdit->toPlainText();
file.write(str.toUtf8());
}
file.close();
}
}
在创建 QTextStream 实例时传递一个 QFile 对象,这样,QFile 对象和 QTextStream 对象就结合在一起了,利用 QTextStream 可读写文件。如果文本文件里有汉字,需要设定为自动识别 Unicode 码,即调用 setAutoDetectUnicode(true) 函数。
void Widget::on_Button_QtsOpen_clicked()
{
//通过文件对话框打开获取文件路径
QString path = QFileDialog::getOpenFileName(this, "打开", "../", "TXT(*.TXT)");
//文件存在
if (path.isEmpty() == false)
{
QFile file(path);
bool b_open = file.open(QIODevice::ReadOnly);
if (b_open == true)
{
//创建数据流,和file文件关联
//往文本流中读取数据,相当从文件里读数据
QTextStream stream(&file);
QString str;
stream >> str;
stream.setAutoDetectUnicode(true) //自动检测Unicode,才能正常显示文档内的汉字
ui->textEdit->setText(str.toUtf8().data());
}
}
}
void Widget::on_Button_QtsSave_clicked()
{
//通过文件对话框打开获取文件路径
QString path = QFileDialog::getOpenFileName(this, "保存", "../", "TXT(*.TXT)");
if (path.isEmpty() == false)
{
QFile file;
//创建数据流,和file文件关联
//往文本流中写入数据,相当往文件里写数据
file.setFileName(path);
bool b_open = file.open(QIODevice::WriteOnly);
if (b_open == true)
{
QTextStream stream(&file);
QString str = ui->textEdit->toPlainText();
stream << str;
}
//关闭文件保存,保存格式为txt文件
file.close();
}
}
QDataStream提供了基于QIODevice的二进制数据的序列化。数据流是一种二进制流,这种流完全不依赖于底层操作系统、CPU 或者字节顺序(大端或小端)。例如,在安装了 Windows 平台的 PC 上面写入的一个数据流,可以不经过任何处理,直接拿到运行了 Solaris 的 SPARC 机器上读取。由于数据流就是二进制流,因此我们也可以直接读写没有编码的二进制数据,例如图像、视频、音频等。
QDataStream既能够存取 C++ 基本类型,如 int、char、short 等,也可以存取复杂的数据类型,例如自定义的类。实际上,QDataStream对于类的存储,是将复杂的类分割为很多基本单元实现的。
void Widget::on_Button_QdsOpen_clicked()
{
//通过文件对话框打开获取文件路径
QString path = QFileDialog::getOpenFileName(this, "打开", "../", "TXT(*.TXT)");
if (path.isEmpty() == false)
{
QFile file(path);
bool b_open = file.open(QIODevice::ReadOnly);
if (b_open == true)
{
//创建数据流,和file文件关联
//往数据流中读取数据,相当从文件里读数据
QDataStream stream(&file);
QString str;
int a;
stream >> str >> a;
qDebug() << str.toUtf8().data() << a;
QString t = QString::number(a, 10);
QString txt = str + t;
ui->textEdit->setText(txt.toUtf8().data());
}
}
}
void Widget::on_Button_QdsSave_clicked()
{
//通过文件对话框打开获取文件路径
QString path = QFileDialog::getOpenFileName(this, "保存", "../", "TXT(*.TXT)");
if (path.isEmpty() == false)
{
QFile file;
//创建数据流,和file文件关联
//往数据流中写入数据,相当往文件里写数据
file.setFileName(path);
bool b_open = file.open(QIODevice::WriteOnly);
if (b_open == true)
{
QDataStream stream(&file);
stream << QString("二进制数据流保存测试") << 888;
}
//关闭文件保存,保存格式为二进制文件
file.close();
}
}
)
{
QDataStream stream(&file);
stream << QString("二进制数据流保存测试") << 888;
}
//关闭文件保存,保存格式为二进制文件
file.close();
}
}