精华内容
下载资源
问答
  • 使用QFile 将多种类型的数据保存成二进制文件,其中的int类型数据在读文件时发现不对 例如200000,读取时变成212992。 200000 = 0x00030d40 212992 = 0x00034000 其中0d部分没有被读取,打开保存的二进制...
  • ![图片说明](https://img-ask.csdn.net/upload/201612/19/1482157833_839024.png)QT中这样的二进制文件转换为十进制怎样读取,求教
  • 【QT】二进制读取图像文件并显示

    千次阅读 2019-04-30 16:40:00
    二进制方式读取文件 转换成图像显示 void MainWindow::showImage() { //打开文件对话框 QString lastPath="D:/Englishpath/QTprojects/DATA/videoData"; fileName = QFileDialog::getOpenFileName...

    打开对话框选择文件

    二进制方式读取文件

    转换成图像显示

     

     

    void MainWindow::showImage()
    {
        //打开文件对话框
    
        QString lastPath="D:/Englishpath/QTprojects/DATA/videoData";
        fileName = QFileDialog::getOpenFileName(this,"OpenFile", lastPath);
        if(fileName.isEmpty())
        {
            QMessageBox::information(this,"Error Message","Select File Failed");
            return;
        }
        QFile file(fileName);
        if(!file.open(QIODevice::ReadOnly))
        {
            QMessageBox::information(NULL,"失败提示","打开失败",QMessageBox::Ok,QMessageBox::Ok);
            return;
        }
    //    QTextStream in(&file);
    //    ui->textEdit->setText(in.readAll());
    
        //类型转换为可以被ifstream使用的
        QString str =fileName;
        char *s; QByteArray//QString转换为char*
        ba = str.toLatin1();
        s = ba.data();
    
        // [1]得到二进制数据;
        using std::ifstream;
        ifstream i_f_stream(s,ifstream::binary);
        i_f_stream.seekg(0, i_f_stream.end);
        int length = i_f_stream.tellg();
        i_f_stream.seekg(0, i_f_stream.beg);
        char *buffer = new char[length];
        i_f_stream.read(buffer, length);//一次性读取
        i_f_stream.close();
    
        // [2]缓存数据重构;
        QByteArray byteArray(buffer, length);
    
        // [3] 构建图片对象并载入二进制数据;
        QImage img;
        img.loadFromData(byteArray, "png");
    
        // [4] 结果检测(将图片保存到某一目录、用label显示);
        img.save(QString("test.bmp"), "png");
        ui->d_label->setPixmap(QPixmap::fromImage(img));
    
        delete [] buffer;
    
    //    QDataStream in(&file);
    //    while( !in.atEnd())
    //    {
    //        QByteArray s;
    //        in >> s;
    //        file.close();
    //        qDebug()<<s<<endl;
    //    }
    }

     

    【转载自】

    std::ifstream以二进制方式读取图片文件,用Qt再将其转为图片(QImage::loadFromData()函数使用) - ypy9323的博客 - CSDN博客 https://blog.csdn.net/ypy9323/article/details/81835530

    转载于:https://www.cnblogs.com/wxl845235800/p/10796886.html

    展开全文
  • 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();
    }

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

    展开全文
  • 求大神指点这样的二进制二进制文件怎么读? 01 00 00 00 18 fc ff ff 00 00 00 00 00 00 00 00 ff ff 00 00 ff ff 00 00 00 00 00 00 ff ff 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00...
  • Qt读取图片有问题-应以二进制文件读取 通过二进制图区QImage bool GetImg(QImage &pix, QString &strFileName) { QFile file(strFileName); char *m_pBuff = NULL; int m_nBuffSize; if (!file.open.....

    Qt读取图片有问题-应以二进制文件读取

    1. 通过二进制图区QImage
    bool  GetImg(QImage &pix, QString &strFileName)
    {
    	QFile file(strFileName);
    	char *m_pBuff = NULL;
    	int m_nBuffSize;
    	if (!file.open(QIODevice::ReadOnly))
    	{
    		QMessageBox::information(NULL, tr("Warning"), tr("File open fail."));
    		return false;
    	}
    	int nSize = file.size();
    	do
    	{
    		m_pBuff = new char[nSize + 1];
    	} while (m_pBuff == NULL);
    
    	QDataStream in(&file);
    	//需要的有效长度为函数返回值,并非nSize
    	m_nBuffSize = in.readRawData(m_pBuff, nSize);
    
    	//读取失败则结束操作
    	if (m_nBuffSize == -1)
    	{
    		return false;
    	}
    
    	//验证读取的数据,通过转化成图片显示出来
    	if (!pix.loadFromData(reinterpret_cast<unsigned char*>(m_pBuff), m_nBuffSize))
    	{
    		return false;
    	}
    	return true;
    }
    
    1. 通过二进制读取QPixmap
    bool  GetPix(QPixmap &pix,QString &strFileName)
    {
    	QFile file(strFileName);
    	char *m_pBuff = NULL;
    	int m_nBuffSize;
    	if (!file.open(QIODevice::ReadOnly))
    	{
    		QMessageBox::information(NULL, tr("Warning"), tr("File open fail."));
    		return false;
    	}
    	int nSize = file.size();
    	do
    	{
    		m_pBuff = new char[nSize + 1];
    	} while (m_pBuff == NULL);
    
    	QDataStream in(&file);
    	//需要的有效长度为函数返回值,并非nSize
    	m_nBuffSize = in.readRawData(m_pBuff, nSize);
    
    	//读取失败则结束操作
    	if (m_nBuffSize == -1)
    	{
    		return false;
    	}
    
    	//验证读取的数据,通过转化成图片显示出来
    	if (!pix.loadFromData(reinterpret_cast<unsigned char*>(m_pBuff), m_nBuffSize))
    	{
    		return false;
    	}
    	return true;
    }
    

    转载于:https://www.cnblogs.com/readlearn/p/10806386.html

    展开全文
  • Qt开发二进制文件读取与操作学习汇总导言需求分析Qt API:QFile问题分析输出结果:进行二次处理:输出结果如图:分析:Qt API:QDataStream问题分析:输出结果:C原生API:FILE(fopen,fread,fseek,fwrite)分析;...

    导言

    最近在进行Qt开发,涉及大量的matlab转C的工作,其中有很大一部分工作是读取二进制文件并对数据进行操作,而在matlab里简易清晰的读取方式,用C来实现往往会遇到很多问题,因此工作告一段落之后对近期学习工作的成果做总结以备不时之需也是必要的。

    	这里我一共尝试了4种方法
    

    需求分析

    这里我对工作中matlab的程序需要实现的功能进行讲解:
    在这里插入图片描述
    在这里插入图片描述

    fseek(fid,0,'eof');           %指针移到文件数据末尾
    Blen=ftell(fid);              %获得指针位置  即末尾的位置,相当于数据长度
    fseek(fid,0,'bof');           %重新回到文件数据开头
    
    //uint8一个字节,uint16两个字节,uint32四个字节
    obj_num=fread(fid,1,'uint8'); %读取第一个字节的数据并转为十进制给obj_num
    rat=fread(fid,1,'uint8');   	%接着读取文件第二个字节的数据转为十进制给rat
    fread(fid,1,'uint16');        	%接着第3,4字节的数据,但并不赋值
    L=fread(fid,1,'uint16');   	   %接着读取第5.6字节的数据,转为十进制给L
    
    ys_da=fread(fid,L,'int16'); 	% 接着读取L个int16的数据每个都转为十进制,以数组的方式保存在ys_da里
    

    Qt API:QFile

    问题分析

    1.可见,我们使用QFile实例化的file来按字节进行读取,出来的会是按单个字节隔开的十六进制数
    
    2.即便是一次读两个字节,也不会处理成一个两字节的十六进制数,只会是按照两个十六进制的单字节数据放在一起
    
    3.很明显的发现,该API函数将十六进制数20H即32翻译成了空格,因为空格的ascll码为32
    
        QFile file(Rpath);
       	if (!file.open(QFile::ReadOnly))
       	{
       		qDebug() << "Could not open file for reading";
       		return;
       	}
       	QByteArray obj_num = file.read(1);
       	QByteArray rat = file.read(1);
       	QByteArray dd = file.read(2);
       	QByteArray L0 = file.read(2);
       	qDebug() << obj_num << endl << rat << endl << dd << endl << L0 << endl;
    

    输出结果:

    在这里插入图片描述

    进行二次处理:

       int Read(QByteArray str)
       {
       		/*
       		将按字节排放的十六进制字符转为按照传入字节数的排放
       		的十六进制转十进制数。
       
       		如  \xFF\x01    --->      \x01FF     --->     511
       
       			原理:一个字节即为两个十六进制数,二进制数据存储顺序和
       		十六进制数据字节读取顺序刚好相反
       
       		如	文件里是 FF 01 01 00 读的时候就要读成	000101FF
       		*/
       		QString newstr = str.toHex();
       		int len = newstr.length() / 2;
       		bool ok;
       		QString temp = "";
       		for (int i = len; i > 0; i--)
       		{
       			temp = temp + newstr[i * 2 - 2] + newstr[i * 2 - 1];
       		}
       		int out = temp.toInt(&ok, 16);
       		return out;
       }
    
       	QFile file(Rpath);
       	if (!file.open(QFile::ReadOnly))
       	{
       		qDebug() << "Could not open file for reading";
       		return;
       	}
       	bool ok0;
       	int obj_num = file.read(1).toHex().toInt();
       	int rat = file.read(1).toHex().toInt(&ok0, 16);
       	int dd = file.read(2).toHex().toInt();
       	QByteArray L0 = file.read(2);
       	int L = Read(L0);
    
       	qDebug() << obj_num << endl << rat << endl << dd << endl << L << endl;
    

    输出结果如图:

    在这里插入图片描述

    分析:

    虽然问题得到了解决,但显然这样的操作对于读文件而言还是过于繁琐,尤其是还要实现读取L个int16即多个2字节的数据,要将读出的数据按照两字节进行分割再传入Read函数里进行处理。
    

    Qt API:QDataStream

    问题分析:

    显然存在着如果读取的是多字节转进制之后数据会出错,如L是int16类型即两字节的数据,会被转十进制转为-255(因为-255的十六进制为\xFF01),那我们还需要转回去进行处理再进行转十进制,未免过于笨蛋
    
       	QFile file(Rpath);
       	if (!file.open(QFile::ReadOnly))
       	{
       		qDebug() << "Could not open file for reading";
       		return;
       	}
       	qint8 obj_num;
       	qint8 rat;
       	qint16 dd;
       	qint16 L;
       	QDataStream MyRead(&file);
       	MyRead >> obj_num;
       	MyRead >> rat;
       	MyRead >> dd;
       	MyRead >> L;
       	qDebug() << obj_num << endl << rat << endl << dd << endl << L << endl;
    

    输出结果:

    在这里插入图片描述

    C原生API:FILE(fopen,fread,fseek,fwrite)

    分析;

    完美符合需求,也是matlab的读二进制文件的实际方法,只不过matlab应该是对原来的api进行了重载,功能大差不错
    
       //QString  类型转换 const char *
       	QByteArray ba1;
       	ba1.append(Rpath);
       	const char *rpath = ba1.data();
    
       	FILE * rfid = fopen(rpath, "rb");
       	if (rfid == NULL)
       	{
       		QString theLog = "没有成功打开" + filename + "文件";
       		QMessageBox::warning(this, "警告!", theLog);
       		return;
       	}
       	fseek(rfid, 0, 2);
       	int Blen = ftell(rfid);
       	fseek(rfid, 0, 0);
    
       	UINT8 obj_num;	
       	UINT8 rat;
       	UINT16 dd;	
       	UINT16 L;
       	//fread(存放地址,单个数据的字节数,读几个数据,文件柄)   返回值为0或1
       	fread(&obj_num, sizeof(UINT8), 1, rfid);
       	fread(&rat, sizeof(UINT8), 1, rfid);
       	fread(&dd, sizeof(UINT16), 1, rfid);
       	fread(&L, sizeof(UINT16), 1, rfid);
       	printf("%d\n ", obj_num);
       	printf("%d\n ", rat);
       	printf("%d\n ", dd);
       	printf("%d\n ", L);
    

    逐字节以规定字节数写入:

       //解决中文路径乱码
       //Wpath是你的文件路径
       QTextCodec *code = QTextCodec::codecForName("GB2312");
       std::string name = code->fromUnicode(Wpath).data();
       FILE * wfid = fopen(name.c_str(), "wb");
       //单个数据
       int buf = 1;
       int buf1 = 1000000;
       int buf2 = 0;
       fwrite(&buf, 1, 1, wfid);  //01
       fwrite(&buf, 1, 1, wfid);  //01
       fwrite(&buf1, 4, 1, wfid); //40 42 0F 00
       fwrite(&buf2, 4, 1, wfid); //00 00 00 00
       fwrite(&buf2, 4, 1, wfid); //00 00 00 00
       fwrite(&buf, 1, 1, wfid);  //01
    
    
    
       //一个数组  data是你的数据,LEN是你的数组长度
       	INT16 *outD = new INT16[LEN];
       	//输出滤波后的数据
       	for (int j = 0; j < LEN; j++) {
       		outD[j] = data[j];
       	}
       	//写文件
       	fwrite(outD, sizeof(INT16), LEN, wfid);
       	//清理内存空间
       	delete outD;
    

    输出结果:

    在这里插入图片描述

    Windons API:CreateFileA,GetFileSize,ReadFile

    分析:

    1.完美满足需求
    2.思路:先将数据全部读进来,再以指针寻址的方式将对应的数据以对应字节数取出,方便易用
    
    char* Vsqt::MyOpenFile(QString path)
    {
       char* fileBuff;
       // 解决中文路径
       QTextCodec *code = QTextCodec::codecForName("GB2312");
       std::string name = code->fromUnicode(path).data();
       HANDLE hFile = ::CreateFileA(name.c_str(),
       	GENERIC_READ,
       	0,
       	NULL,
       	OPEN_EXISTING,
       	FILE_ATTRIBUTE_NORMAL, NULL
       );
    
       fileSize = ::GetFileSize(hFile, 0);
       fileBuff = new char[fileSize];
       DWORD realRead;
    
       bool bsucess = 0;
       bsucess = ::ReadFile(hFile, fileBuff, fileSize, &realRead, NULL);
       if (!bsucess)
       	return 0;
       CloseHandle(hFile);
    
       return fileBuff;
    }
    
       	char *fileBuff = MyOpenFile(Rpath);			//读取全部数据
       	if (fileBuff == 0)
       	{
       		QString theLog = "没有成功打开" + filename + "文件";
       		QMessageBox::warning(this, "Warning!", theLog);
       		return;
       	}
       	
       	int obj_num = *(BYTE*)fileBuff;		
       	int rat = *(BYTE*)(fileBuff + 1);	
       	int dd = *(WORD*)(fileBuff + 2);	
       	int L = *(WORD*)(fileBuff + 4);	
       	int Blen = fileSize;
       	cout << obj_num << endl << rat << endl << dd << endl << L << endl;
    

    输出结果如图:

    在这里插入图片描述

    其他

    注意:当我们的数据不知道是正数还是负数时且字节数不够表达这个数时我们需要像如下的操作:

    	vector<double> ys_da;					//  里面为要计算的数据,一个数据为2个字节
       //处理计算数据,判断正负进行
       	for (int i = 0; i < wlen; i++) {
       		if ((*(WORD*)fileBuff & 0x8000) == 0)	//正数
       			ys_da.push_back(*(WORD*)fileBuff);
       		else {									//负数
       			ys_da.push_back((INT32)(*(WORD*)fileBuff | 0xFFFF0000));
       		}
       		fileBuff = fileBuff + 2;
       	}
    

    注意

    该文章仅个人学习使用,欢迎大家一起交流学习

    展开全文
  • 这个事利用QT进行编程实现对图片进行一二进制存入到文件的源代码
  • QDataStream通过二进制方式读取文件

    千次阅读 2019-11-21 20:19:50
    使用二进制方式读写文件 #include "widget.h" #include "ui_widget.h" #include <QDataStream> #include <QFile> #include <QDebug> // #define cout qDebug()<<"["<<__FILE__<<...
  • QFile和C语言对文件操作的性能比较.--...关键问题在于:QFile读取double型二进制数据流,只有两种方法处理数值。   一是通过QDataStream一个一个double读取,存储在一个QVector中 二是通过QFile read(int l
  • Qt学习之路之二进制文件读取

    千次阅读 2015-01-05 15:59:29
    QDataSteam类提供了将二进制文件串行化的功能, 用实现基本数据类型, 例如char , int , char *, int等的串行化。 下面是使用QDataStream读写二进制文件示例。 binary.h #ifndef BINARY_H #define BINARY_H #...
  • 这可能是一个比较基础的问题,但由于刚开始学习c++,但是对我来说,结构体快速从二进制文件读取数据,给我解决了很大的问题,这里我把方法写出来,和有需要的人分享一下,高手看到了请多包涵。 我的二进制文件是按照...
  • 这是C的代码 //写入二进制文件 FILE *f=fopen("F:\\g.txt","wb+"); double d=123456123.1231231131; fwrite(&d,sizeof(double),1,f); fclose(f); //从二进制文件读出 FILE *fop=fopen("F:\\g.txt","rb"); dou
  • 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++) //读取...
  • 关于读取二进制文件 read() 读取指定字节数的问题 遇到的问题 ​ 今天在写组件的时候遇到的读取指定字节数的二进制文件,并且要求如果要求重复读取,则要从文件中从头开始读取。 问题分析 ​ 对于读取二进制文件,...
  • Qt读取以16进制存储的二进制文件

    千次阅读 2018-07-04 18:51:48
    首先清楚二进制文件常见格式 .bin .hex 读取方法使用Qt File 打开 然后使用QDataStream进行读取文本文件常见格式 .txt读取方法使用Qt File 打开 然后使用QTextStream进行读取源码QString fileName = QFileDialog::...
  • Qfile文件读取以及写入

    千次阅读 2017-09-15 17:27:15
    QT有QFile类来用作文件的读取和写入,可以是存取为二进制文件。
  • 读取和写入二进制数据 Qt中载入和保存二进制数据的最简单方式是通过实例化一个 QFile 打开文件,然后通过QDataStream对象存取它。QDataStream 提供了一种与运行平台元关的存储格式,它不仅支持 List<T>和 QMap...
  • QT读取二进制文件

    千次阅读 2017-05-23 23:07:52
    void MainWindow::ReadPicture() { QByteArray m_data; QFile file("H:/BaiduYunDownload/Cache/test.jpg"); if(file.open(QIODevice::ReadOnly)) { m_data = file.readAll(); cout

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,041
精华内容 416
关键字:

qfile二进制读取