二进制文件的读写:

QDataStream 提供了基于 QIODevice 的二进制数据的序列化。数据流是一种二进 制流,这种流完全不依赖于底层操作系统、CPU 或者字节顺序(大端或小端)。由于数据流就是二进制 流,因此我们也可以直接读写没有编码的二进制数据,例如图像、视频、音频等。 QDataStream 既能够存取 C++ 基本类型,如 int、char、short 等,也可以存 取复杂的数据类型,例如自定义的类。实际上,QDataStream 对于类的存储,是 将复杂的类分割为很多基本单元实现的。
1,写二进制文件:


    QString path = QFileDialog::getSaveFileName(this,"open","./","source(*.cpp)");
    if(path.isEmpty() == false){
        QFile file(path);
        if(file.open(QIODevice::WriteOnly) == true)
        {
            /*常见数据流和file文件关联
             * 往数据流输入数据=往文件里面写数据
            */
            QDataStream stream(&file);
            stream << QString("测试") << 250;

            file.close();
        }
    }

注:创建数据量对象的时候绑定输入输出驱动后,向数据流里面写数据,相当于往驱动绑定的文件里面写数据。和标准C++里面的输入输出流一样,<<表示数据的流向。
2,读二进制文件

    QString path = QFileDialog::getOpenFileName(this,"open","./","source(*.cpp)");
    if(path.isEmpty() == false){
        QFile file(path);
        if(file.open(QIODevice::ReadOnly) == true)
        {
            /*常见数据流和file文件关联
             * 往数据流输出数据=文件读数据
            */
            QDataStream stream(&file);
            /*读的时候按写的顺序取数据*/
            QString str ;
            int a ;
            stream >> str >> a;
            /*转成char*类型的数据输出*/
            cout <<str.toUtf8().data();
            cout <<a;

            file.close();
        }
    }

注:读的时候要注意数据写入顺序。
对于cout我们使用宏定义如下:

#define cout qDebug() << "[" << __FILE__ << ":" << __LINE__ <<"]"

这样在输出的时候就可以输出文件名和行号,便于调试。

文本文件的读写:

二进制文件比较小巧,却不是人可读 的格式。而文本文件是一种人可读的文件。为了操作这种文件,我们需要使用 QTextStream 类。QTextStream 和 QDataStream 的使用类似,只不过它是操作纯 文本文件的。 QTextStream 会自动将 Unicode 编码同操作系统的编码进行转换,这一操作对 开发人员是透明的。它也会将换行符进行转换,同样不需要自己处理。
1,写文本文件:

 QString path = QFileDialog::getSaveFileName(this,"Save","./","source(*.cpp)");

    if(path.isEmpty() == false)
    {
        QFile file(path);
        if(file.open(QIODevice::WriteOnly) == true)
        {
            QTextStream textStream(&file);
            /*指定编码*/

            textStream.setCodec("UTF-8");
            textStream << QString("你好,世界!") << 1000;

            file.close();

        }

    }

注:关于QTextStream 只是比QDataStream 多了一个可以指定编码,其余方法相同。
2,写文本文件:

  QString path = QFileDialog::getOpenFileName(this,"Save","./","source(*.cpp)");

    if(path.isEmpty() == false)
    {
        QFile file(path);
        if(file.open(QIODevice::ReadOnly) == true)
        {
            QTextStream textStream(&file);
            /*指定编码*/

            textStream.setCodec("UTF-8");
            /*
             默认全部为字符串
            QString str;
            int a;

            textStream >> str >> a;

            cout << str.toUtf8().data() << a;
            */
            QString str;
            str = textStream.readAll();
            cout << str;
            file.close();

        }

    }

注:在读文件的时候一般指定的编码和写文件的时候相同,防止出现乱码,字在读的时候和QDataStream不同的是,它默认全部为字符串,如果按照顺序读取的时候,后面的整型变量为0,因为把整型数默认也为字符,所以读的时候一般采用和QFile相同的方式读
1,如上,全部直接读写

			QString str;
            str = textStream.readAll();
            cout << str;

2,也可以采用一个循环一行一行读取

while(textStream.atEnd() == false)
            {
                str += textStream.readLine();
            }

使用QBuffer配合二进制数据流读写文件

1,普通QBuffer读写文件:

	/*定义字节数组和QBuffer对象*/
    QByteArray array;
    QBuffer memFile(&array,this);
    /*打开*/
 	memFile.open(QIODevice::WriteOnly);
	/*写入数据*/
    memFile.write("111111111111111111111");
    memFile.write("22222222222222222222222");
	/*关闭,并且写入*/
    memFile.close();

    qDebug() << memFile.buffer();
    qDebug() << "array="<< array;

注意:每次在缓冲写入数据之后必须要关闭之后才能正常写入。
2,配合二进制流读写数据:
写入数据(QString类型和整型):

	QBuffer memFile(this);
	
	memFile.open(QIODevice::WriteOnly);
    QDataStream stream(&memFile);
    stream << QString("测试") <<250;
    memFile.close();

读数据:

	memFile.open(QIODevice::ReadOnly);
    QDataStream stream1(&memFile);
    QString str;
    int a;
    stream1 >> str >> a;
    qDebug() << str.toUtf8().data() << a;

注意:读数据的时候不能使用如下方法:

qDebug() << QString(memFile.buffer()).toUtf8().data();

经过多次类型转换之后无法正常读出数据。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐