精华内容
下载资源
问答
  • Qt 二进制文件读写

    千次阅读 2021-02-25 21:39:28
    Qt 使用 QFile 和 QDataStream 进行二进制数据文件读写: QFile 负责文件的 IO 设备接口,即与文件的物理交互; QDataStream 以数据流的方式读取文件内容或写入文件内容。 QDataStream 保存文件时使用的数据编码...

    1.方法

    Qt 使用 QFile 和 QDataStream 进行二进制数据文件的读写:

    • QFile 负责文件的 IO 设备接口,即与文件的物理交互;
    • QDataStream 以数据流的方式读取文件内容或写入文件内容。

    QDataStream 保存文件时使用的数据编码的方式不同,可以保存为两种文件:

    • 用 Qt 预定义编码保存各种类型数据的文件,定义文件后缀为“.stm”。Qt 预定义编码是指在写入某个类型数据,如整形数、字符串等到文件流时,使用 Qt 预定义的编码。可以将这种Qt预定义数据格式编码类比于 HTML 的标记符,Qt 写入某种类型数据时用了 Qt 预定义的标记符,读出数据时,根据标记符读出数据。使用 Qt 预定义编码保存的流文件,某些字节是 QDataStream 自己写入的,我们并不完全知道文件内每个字节的意义,但是用 QDataStream 可以读出相应的数据。
    • 标准编码数据文件,定义文件后缀为“.dat”。在将数据写到文件时,完全使用数据的二进制原始内容,每个字节都有具体的定义,在读出数据时,只需根据每个字节的定义读出数据即可。

    2.Qt预定义编码文件的读写

    保存为stm文件

    数据流写入数据时都使用运算符“<<”,不论写的是 qint16、qreal 还是字符串。

    除了可以写入基本的数据类型外,QDataStream 流操作还可以写入很多其他类型的数据,如 QBrush、QColor, QImage、QIcon 等,这些称为可序列化的数据类型(Serializing Qt Data Types)。

        QString fileName = "test.stm";
    
        QFile file(fileName);
    
        if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
            return false;
    
        //流读取文件
        QDataStream stream(&file);
    
        //设置版本号,写入和读取的版本号要兼容
        stream.setVersion(QDataStream::Qt_5_9);
    
        //写入流
        QString name = "张三";
        int age = 18;
        QColor color("red");
        stream<<name;
        stream<<age;
        stream<<color;
    
        关闭文件
        file.close();

    读取stm文件

        QString fileName = "test.stm";
    
        QFile file(fileName);
    
        if (!file.open(QIODevice::ReadOnly))
            return false;
    
        //流读取文件
        QDataStream stream(&file);
    
        //设置版本号,写入和读取的版本号要兼容
        stream.setVersion(QDataStream::Qt_5_9);
    
        QString name;
        int age = 0;
        QColor color;
    
        //输出流
        stream>>name;
        stream>>age;
        stream>>color;
    
        //关闭文件
        file.close();

    3.标准编码文件的读写

    保存为dat文件

    创建通用格式文件(即文件格式完全透明,每个字节都有具体的定义,如 SEG-Y 文件)的方法是以标准编码方式创建文件,使文件的每个字节都有具体的定义。用户在读取这种文件时,按照文件格式定义读取出每个字节数据并做解析即可,不管使用什么编程语言都可以编写读写文件的程序。
     

        QString fileName = "test.dat";
    
        QFile file(fileName);
    
        if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
            return false;
    
        //流读取文件
        QDataStream stream(&file);
    
        //windows平台
        stream.setByteOrder(QDataStream::LittleEndian);
    
        //写入流
        stream<<QString("张三");
        stream<<qint32(18);
    
        //关闭文件
        file.close();

    读取dat文件

        QString fileName = "test.dat";
    
        QFile file(fileName);
    
        if (!file.open(QIODevice::ReadOnly))
            return false;
    
        //流读取文件
        QDataStream stream(&file);
    
        //windows平台
        stream.setByteOrder(QDataStream::LittleEndian);
    
        QString name;
        int age = 0;
    
        //输出流
        stream>>name;
        stream>>age;
    
        //关闭文件
        file.close();

     

    展开全文
  • QT 二进制文件读取

    千次阅读 2016-12-05 13:15:36
    用于以二进制的方式一次性读取文件的全部内容。版本是QT5.7
    用于以二进制的方式一次性读取文件的全部内容。版本是QT5.7
    
    void Widget::on_sjxOpenFileBtn_clicked()
    {
    
        QString pathName = QFileDialog::getOpenFileName(this,"打开文件",0,0,0,0);
        QFile datFile(pathName);
        if(!datFile.open(QIODevice::ReadOnly))
        {
            QMessageBox::warning(this,"错误","打开失败!!",QMessageBox::Ok,QMessageBox::Ok);
            return;
        }
        QDataStream datIn(&datFile);
        QFileInfo datInfo(pathName);
        char datRawArray[datInfo.size()];
        datIn.readRawData(datRawArray,datInfo.size());
        QString printDat;
        for(int i = 0; i < datInfo.size(); i ++)
        {
            printDat.append(QString::number(((unsigned char)datRawArray[i]),16));
        }
        ui->textEdit->setText(printDat);
        datFile.close();
    }

    读取文本文件的内容
    待读取的文本文件
    读取效果
    读取到的数据

    展开全文
  • 有些数据存储,用明文的形式可能不太好,比如账号密码信息等。所以采取二进制存储就成为了一种新的靠谱选择。本文介绍的是在QT环境下二进制文件读写的一些技巧和注意事项。

    一般而言,用于二进制流的QDataStream和用于文本流的QTextStream。本次讲解QDataStream有关的使用以及一些技巧。

    QDataStream提供了基于QIODevice的二进制数据的序列化。数据流是一种二进制流,这种流完全不依赖于底层操作系统、CPU 或者字节顺序(大端或小端)。例如,在安装了 Windows 平台的 PC 上面写入的一个数据流,可以不经过任何处理,直接拿到运行了 Solaris 的 SPARC 机器上读取。由于数据流就是二进制流,因此我们也可以直接读写没有编码的二进制数据,例如图像、视频、音频等。

    有些数据存储,用明文的形式可能不太好,比如账号密码信息等。所以采取二进制存储就成为了一种新的靠谱选择。本文介绍的是在QT环境下二进制文件的读写的一些技巧和注意事项。

    #include <QtCore/QCoreApplication>
    #include <QDataStream>
    #include <QFile>
    #include <QDir>
    #include <QDebug>
    
    
    namespace
    {
    	const qint32 FILE_VERSION = 1000;
    	const quint32 MAGIC_NUMBER = 0xA8B8C8D8;
    }
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
    	//
    	QString fileName = QString(QDir::tempPath() + "/__bin.dat");
    
    	//
    	// write binary file.
    
    	QFile fileWriter(fileName);
    	if (fileWriter.open(QIODevice::WriteOnly))
    	{
    		QDataStream out(&fileWriter);
    		// 写入魔术数字
    		out << (quint32)MAGIC_NUMBER;
    		// 写入文件版本
    		out << (qint32)FILE_VERSION;
    		// 写入QT版本
    		out.setVersion(QDataStream::Qt_5_9);
    		//
    		out << QString("hellokandy");
    		out << QString("password");
    	}
    	fileWriter.close();
    
    
    	//
    	// read binary file.
    
    	QFile fileReader(fileName);
    	if (!fileReader.exists())
    	{
    		fileReader.close();
    		qDebug() << "file not exist.";
    		return 0;
    	}
    
    	if (fileReader.open(QIODevice::ReadOnly))
    	{
    		QDataStream in(&fileReader);
    		// 检查魔术数字
    		quint32 magicNumber;
    		in >> magicNumber;
    		qDebug() << "magic=" << magicNumber;
    		if (magicNumber != MAGIC_NUMBER)
    		{
    			qDebug() << "data format error.";
    			return 0;
    		}
    
    		// 检查文件版本
    		qint32 fileVersion;
    		in >> fileVersion;
    		qDebug() << "fileVersion=" << fileVersion;
    		if (fileVersion != FILE_VERSION)
    		{
    			qDebug() << "file version error.";
    			return 0;
    		}
    
    		// 读取用户名
    		QString username;
    		in >> username;
    		qDebug() << "username=" << username;
    
    		// 读取密码
    		QString password;
    		in >> password;
    		qDebug() << "password=" << password;
    	}
    	fileReader.close();
    
    
        return a.exec();
    }
    
    
    展开全文
  • 一个二进制文件正常读出来的数据应该是这样的![图片说明](https://img-ask.csdn.net/upload/201612/29/1483004071_459283.png) 但是我用流都出来的都是这样的 1 0 65535 65535 0 65535 0 65536 0 65536 0 0 0 0 ...
  • Qt 二进制文件读写

    2010-11-14 22:13:00
    今天开始进入 Qt 的另一个部分:文件读写,也就是 IO。文件读写在很多应用程序中都是需要的。Qt 通过 QIODevice 提供了IO的抽象,这种设备(device)具有读写字节块的能力。常用的IO读写的类包括以下几个: ...

    本文出自 “豆子空间” 博客,http://devbean.blog.51cto.com/448512/293892


    今天开始进入 Qt 的另一个部分:文件读写,也就是 IO。文件读写在很多应用程序中都是需要的。Qt 通过 QIODevice 提供了IO的抽象,这种设备(device)具有读写字节块的能力。常用的IO读写的类包括以下几个:

    QFlie访问本地文件系统或者嵌入资源
    QTemporaryFile创建和访问本地文件系统的临时文件
    QBuffer读写 QByteArray
    QProcess运行外部程序,处理进程间通讯
    QTcpSocketTCP 协议网络数据传输
    QUdpSocket传输 UDP 报文
    QSslSocket使用 SSL/TLS 传输数据

    QProcess、QTcpSocket、QUdpSoctet 和 QSslSocket 是顺序访问设备,它们的数据只能访问一遍,也就是说,你只能从第一个字节开始访问,直到最后一个字节。QFile、QTemporaryFile 和 QBuffer 是随机访问设备,你可以从任何位置访问任意次数,还可以使用 QIODevice::seek() 函数来重新定位文件指针。
    在访问方式上,Qt 提供了两个更高级别的抽象:使用 QDataStream 进行二进制方式的访问和使用 QTextStream 进行文本方式的访问。这些类可以帮助我们控制字节顺序和文本编码,使程序员从这种问题中解脱出来。
    QFile 对于访问独立的文件是非常方便的,无论是在文件系统中还是在应用程序的资源文件中。Qt 同样也提供了 QDir 和 QFileInfo 两个类,用于处理文件夹相关事务以及查看文件信息等。
    这次我们先从二进制文件的读写说起。
    以二进制格式访问数据的最简单的方式是实例化一个 QFile 对象,打开文件,然后使用 QDataStream 进行访问。QDataStream 提供了平台独立的访问数据格式的方法,这些数据格式包括标准的 C++ 类型,如 int、double等;多种 Qt 类型,如QByteArray、QFont、QImage、QPixmap、QString 和 QVariant,以及 Qt 的容器类,如 QList<T> 和 QMap<K, T>。先看如下的代码:
    代码
    
        
    1 QImage image( " philip.png " );
    2
    3 QMap < QString, QColor > map;
    4 map.insert( " red " , Qt::red);
    5 map.insert( " green " , Qt::green);
    6 map.insert( " blue " , Qt::blue);
    7
    8 QFile file( " facts.dat " );
    9   if ( ! file.open(QIODevice::WriteOnly)) {
    10 std::cerr << " Cannot open file for writing: "
    11 << qPrintable(file.errorString()) << std::endl;
    12 return ;
    13 }
    14
    15 QDataStream out ( & file);
    16   out .setVersion(QDataStream::Qt_4_3);
    17
    18   out << quint32( 0x12345678 ) << image << map;

     


    这里,我们首先创建了一个 QImage 对象,一个 QMap<QString, QColor>,然后使用 QFile 创建了一个名为 "facts.dat" 的文件,然后以只写方式打开。如果打开失败,直接 return;否则我们使用 QFile 的指针创建一个 QDataStream 对象,然后设置 version,这个我们以后再详细说明,最后就像 std 的 cout 一样,使用 << 运算符输出结果。
    0x12345678 成为“魔术数字”,这是二进制文件输出中经常使用的一种技术。我们定义的二进制格式通常具有一个这样的“魔术数字”,用于标志文件格式。例如,我们在文件最开始写入 0x12345678,在读取的时候首先检查这个数字是不是 0x12345678,如果不是的话,这就不是可识别格式,因此根本不需要去读取。一般二进制格式都会有这么一个魔术数字,例如 Java 的 class 文件的魔术数字就是 0xCAFE BABE(很 Java 的名字),使用二进制查看器就可以查看。魔术数字是一个 32 位的无符号整数,因此我们使用 quint32 宏来得到一个平台无关的 32 位无符号整数。
    在这段代码中我们使用了一个 qPrintable() 宏,这个宏实际上是把 QString 对象转换成 const char *。注意到我们使用的是 C++ 标准错误输出 cerr,因此必须使用这个转换。当然,QString::toStdString() 函数也能够完成同样的操作。
    读取的过程就很简单了,需要注意的是读取必须同写入的过程一一对应,即第一个写入 quint32 型的魔术数字,那么第一个读出的也必须是一个 quint32 格式的数据,如:
    代码
    
         
    1 QFile file( " file.xxx " );
    2 file.open(QIODevice::WriteOnly);
    3 QDataStream out ( & file);
    4
    5   // Write a header with a "magic number" and a version
    6 out << (quint32) 0xA0B0C0D0 ;
    7 out << (qint32) 123 ;
    8
    9 out .setVersion(QDataStream::Qt_4_0);
    10
    11 // Write the data
    12 out << lots_of_interesting_data;

     


    这个 file.xxx 文件的版本号是 123。我们认为,如果版本号是123的话,则可以使用 Qt_4_0 版本读取。所以我们的读取代码就需要判断一下:

    代码
    
         
    1 QFile file( " file.xxx " );
    2 file.open(QIODevice::ReadOnly);
    3 QDataStream in ( & file);
    4
    5 // Read and check the header
    6 quint32 magic;
    7 in >> magic;
    8 if (magic != 0xA0B0C0D0 )
    9 return XXX_BAD_FILE_FORMAT;
    10
    11 // Read the version
    12 qint32 version;
    13 in >> version;
    14 if (version < 100 )
    15 return XXX_BAD_FILE_TOO_OLD;
    16 if (version > 123 )
    17 return XXX_BAD_FILE_TOO_NEW;
    18
    19 if (version <= 110 )
    20 in .setVersion(QDataStream::Qt_3_2);
    21 else
    22 in .setVersion(QDataStream::Qt_4_0);
    23
    24 // Read the data
    25 in >> lots_of_interesting_data;
    26 if (version >= 120 )
    27 in >> data_new_in_XXX_version_1_2;
    28 in >> other_interesting_data;

     


    这样,我们就可以比较完美的处理二进制格式的数据读写了。

    转载于:https://www.cnblogs.com/weiweiqiao99/archive/2010/11/14/1877208.html

    展开全文
  • #include <QObject> #include <QFile> #include <QDataStream> #include <iostream> using namespace std; #define MAXSIZE 20000 template<...bool bin_save(T* p_s, int n...
  • QDataStream提供了基于QIODevice的二进制数据的序列化。数据流是一种二进制流,这种流完全不依赖于底层操作系统、...由于数据流就是二进制流,因此我们也可以直接读写没有编码的二进制数据,例如图像、视频、音频等...
  • 除了文本文件之外,其他需要按照一定的格式定义读写文件都称为二进制文件。 每种格式的二进制文件都有自己的格式定义,写入数据时按照一定的顺序...Qt使用 QFile 和 QDataStream 进行二进制数据文件读写: QFil...
  • 除了文本文件之外,其他需要按照一定的格式定义...Qt使用 QFile 和 QDataStream 进行二进制数据文件读写: QFile 负责文件的 IO 设备接口,即与文件的物理交互; QDataStream 以数据流的方式读取文件内容或写入.
  • Qt开发二进制文件读取与操作学习汇总导言需求分析Qt API:QFile问题分析输出结果:进行二次处理:输出结果如图:分析:Qt API:QDataStream问题分析:输出结果:C原生API:FILE(fopen,fread,fseek,fwrite)分析;...
  • QDataStream提供了基于QIODevice的二进制数据的序列化。数据流是一种二进制流,这种流’完全不依赖于底层操作系统、...由于数据流就是二进制流,因此我们也可以直接读写没有编码的二进制数据,例如图像、视频、音频...
  • //待发送文件大小 auto sendCnt = (int)ceil(fileLen / (PACKET_SIZE*1.0));//发送次数 auto lastLen = fileLen % PACKET_SIZE;//最后一次发送的大小 if(0 == lastLen){//恰巧是PACKET_SIZE的整数倍 lastLen = ...
  • QT二进制流方式读写文件

    千次阅读 2019-04-02 20:27:14
    ui内容为两个按钮加一个文本编辑控件,以字节流方式保存一个文件,然后以流方式打开并通过转码显示。 #include "mywidget.h" #include "ui_mywidget.h" #include <QDebug> MyWidget::MyWidget(QWidget *...
  • Qt二进制文件操作

    2010-04-18 08:55:00
    今天开始进入 Qt 的另一个部分:文件读写,也就是 IO。文件读写在很多应用程序中都是需要的。Qt 通过 QIODevice 提供了IO的抽象,这种设备(device)具有读写字节块的能力。常用的IO读写的类包括以下几个:QFlie访问...
  • 除了文本文件之外,其他需要按照一定的格式定义读写文件都称为二进制文件。 每种格式的二进制文件都有自己的格式定义,写入数据时按照一定的...Qt 使用 QFile 和 QDataStream 进行二进制数据文件读写: QFil...
  • Qt-二进制文件读写-QDataStream

    千次阅读 2018-03-01 10:54:41
    转自:http://blog.51cto.com/devbean/293892今天开始进入 Qt 的另一个部分:文件读写,也就是 IO。文件读写在很多应用程序中都是需要的。Qt 通过 QIODevice 提供了IO的抽象,这种设备(device)具有读写字节块的能力...
  • Qt 学习 之 二进制文件读写

    万次阅读 2015-06-11 16:59:26
    同时,Qt 还提供了更高一级的操作:用于二进制的流QDataStream和用于文本流的QTextStream。本节,我们将讲解有关QDataStream的使用以及一些技巧。下一章则是QTextStream的相关内容。QDataStream提供了基于Q
  • 还有一篇博客,希望能分享点东西, 直接百度搜"Qt实现GUI的二进制文件读写操作(源码分析+工程打包+测试例子)
  • Qt读取二进制文件

    千次阅读 2019-05-09 11:40:22
    Qt读取二进制文件 文件开头添加 #include <QFile> 在构造函数添加: QFile file("D:\\DATA\\123.DAT"); file.open(QIODevice::ReadOnly); qint16 t; int data[2000]; for(int i=0;i<2000;i++) //读取...
  • QT读写二进制文件

    2021-06-25 10:28:42
    1.定义结构体 #pragma pack(1) //字节对齐 struct ALARM_FILE { char STATUS_DATA[9]; char STATUS_TIME[7]; int AlarmNo;... int MONITOR_ALARM_FLAG;...2.写二进制文件 ALARM_FILE alarmFile; //

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,840
精华内容 3,536
关键字:

qt二进制文件读取