QFile QBuffer QTextStream QDataStream用法
QFile和QBuffer都是QIODevice的一种,其他I/O设备还包括QProcess, QTcpSocket等,区别如下:
l 顺序访问设备:
是指它们的数据只能访问一遍:从头走到尾,从第一个字节开始访问,直到最后一个字节,中途不能返回去读取上一个字节,这其中,QProcess、QTcpSocket、QUdpSoctet和QSslSocket是顺序访问设备。
l 随机访问设备:
可以访问任意位置任意次数,还可以使用QIODevice::seek()函数来重新定位文件访问位置指针,QFile、QTemporaryFile和QBuffer是随机访问设备。
首先我们以QFile类的操作为例(QBuffer类似),QFile可以关联本地文件,然后我们可以使用QIODevice提供的read()、readLine()、readAll()以及write()函数对文件进行操作,也可以构建QTextStream文本流,对本地文件进行操作。
利用QIODevice提供接口函数进行操作:
int main(int argc, char *argv[]) { QApplication app(argc, argv); QFile file("in.txt"); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "Open file failed."; return -1; } else { while (!file.atEnd()) { qDebug() << file.readLine(); } } return app.exec(); }
利用QTextStream进行操作:
int main(int argc, char *argv[]) { QApplication app(argc, argv); //创建文件对象 QFile file("../test.txt"); //打开文件, 只写方式打开 bool isOk = file.open(QIODevice::WriteOnly); if(true == isOk) { QTextStream stream(&file); //指定编码 stream.setCodec("UTF-8"); stream << QString("主要看气质") << 250; file.close(); } return app.exec(); }
QDataStream二进制流,用处是例如我们可以将整个类以二进制流的形式写入到本地文件进行保存,读出时要和写入顺序一致,二进制文件打开之后一般为乱码,即使写入的是QString类,因为它保存的是类的各个成员变量的二进制数据,和C语言中如果将char*类型数据以二进制的形式写入到文件可能还可以看,但这里写入的类,所以是乱码:
int main(int argc, char *argv[]) { QApplication app(argc, argv); //创建文件对象 QFile file("../test.txt"); //打开文件, 只写方式打开 bool isOk = file.open(QIODevice::WriteOnly); if(true == isOk) { //创建数据流,和file文件关联 //往数据流中写数据,相当于往文件里写数据 QDataStream stream(&file); stream << QString("主要看气质") << 250; file.close(); } return app.exec(); }
QBuffer对应的不在是磁盘上的文件,而是内存中的空间,但基本操作和QFile一致
int main(int argc, char *argv[]) { QApplication app(argc, argv); QByteArray array; QBuffer memFile(&array); //创建内存文件 memFile.open(QIODevice::WriteOnly); memFile.write("11111111111111111"); memFile.write("22222222222222222222"); memFile.close(); qDebug() << memFile.buffer(); qDebug() << "array" << array; QBuffer memFile1; memFile1.open(QIODevice::WriteOnly); QDataStream stream(&memFile1); stream << QString("测试") << 250; memFile1.close(); qDebug() << memFile1.buffer(); memFile1.open(QIODevice::ReadOnly); QDataStream in; in.setDevice(&memFile1); QString str; int a; in >> str >> a; memFile1.close(); qDebug() << str.toUtf8().data() << a; return app.exec(); }QBuffer可以绑定一个QByteArray类型,也可以不绑定。