• 17747阅读
  • 11回复

[提问]关于读取.dat文件的方法,大牛们帮忙~ [复制链接]

上一主题 下一主题
离线gaojinwei
 
只看楼主 倒序阅读 楼主  发表于: 2011-08-14

读取一个二进制的data文件,文件大小4M,我用如下代码读:
QByteArray data;  
QFile file("D:/data/000000001.dat");  
file.open(QIODevice::ReadOnly);  
QDataStream in(&file);  
in>>data;  qDebug()<<data;
编译能通过,但是控制台弹出后就出错?这是由于所读文件太大了么?
出错提示:
:: error: cannot open output file debug\duquwenjian.exe: Permission denied
:: error: collect2: ld returned 1 exit status
其实这个文件我想用如下代码读,我想把数据读到pDATA中,但是4M的数据我只想读前1M,在VC中我用readHuge(pDATA,0x10000)可以读取这个.dat文件的前1M,不知道Qt中如何实现,这个是我仿照C++中的方式编写的:
unsigned char *pDATA=new unsigned char[0x100000];
QFile file("D:/data/000000001.dat");
file.open(QIODevice::ReadOnly);  
QDataStream in(&file);
in>>pDATA;
qDebug()<<pDATA;
依然不能用。下面是我要打开dat文件的一部分截图,这个是我用ultraEdit打开的。




我是Qt菜鸟,正在努力学习,呵呵,希望牛人不吝赐教~我希望能在控制台查看这个数据的输出,只查看前十位就行,确定数据是否读取正确。

离线dbzhang800

只看该作者 1楼 发表于: 2011-08-14
你想太多了,就是一个简单的链接错误!

关掉正在运行的duquwenjian.exe,然后再编译链接!!
离线gaojinwei
只看该作者 2楼 发表于: 2011-08-15
谢谢楼上回答,果然是这样,呵呵,但是我在控制台看到的全是乱码]
何解?完全崩溃了,弄了两天了我,论坛所有关于文件操作的帖子我几乎都看了一遍。我想读前1M数据,不知道各位有什么方法?
离线dbzhang800

只看该作者 3楼 发表于: 2011-08-15
1. 二进制,你当作纯文本解释,不乱码才怪。

2. 最好不要使用 QDataStream,如果你这个文件不是QDataStream生成的话。

3. 不用搜论坛,去看QFile和QByteArray的manual对你解决问题会更有效。
离线gaojinwei
只看该作者 4楼 发表于: 2011-08-15
mark一下,谢谢dbzhang800的回答,我晚上有时间我再试试,今天晚上回报成果
离线zlgdgzl
只看该作者 5楼 发表于: 2011-08-15
呵呵,比较好啊!
离线roywillow

只看该作者 6楼 发表于: 2011-08-15
那个dat中的数据究竟是什么东西?
如果只是你需要的bytearray中的具体数据的话,那么直接用QFile的readAll函数,如果你用stream的流操作的话,会把里面的数据当做一个QByteArray类来处理的
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线gaojinwei
只看该作者 7楼 发表于: 2011-08-15
汇报刚才成果,呵呵,多谢dbzhang800和roywillow提供的建议,我看了manual之后,发现manual太好了,非常详细,假如我英语如果好点的话,应该更容易些,下面是我读取的.dat文件代码,贴出来,请大家指正:
#include <QtCore/QCoreApplication>
#include <QFile>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QByteArray data;
    QFile file("D:/data/000000001.dat");
    file.open(QIODevice::ReadOnly);
    data = file.readAll();
    qDebug()<<data.toHex()<<'\t'<<data.capacity();
    return a.exec();
}
这段代码运行情况如下:


输出了data的值以后,显示个数为4194304,即4M(0x400000);


在控制台可以看到.dat文件的十六进制输出。但是假如输出代码改成qDebug()<<data;也就是去掉toHex();就出现了乱码。由于刚接触qt不长时间,对QByteArray了解不够深刻,我不知道问题出在哪里。我认为,既然是byte array,假如不加.toHex()应该也能输出二进制代码,但是出现的是乱码,而加上.Hex() 则能和ultraEdit里看到的数据一样。求解~
以后我得好好研究一下manual了~
下一步就是对data里的数据进行处理了,主要用c,谢谢大家帮忙。
离线dbzhang800

只看该作者 8楼 发表于: 2011-08-15
说实话,manual不能解决你的这种问题,你可能需要随便找本C或C++的教材,重新看看前3章

搞清楚  '0',0x0, ‘\x0’, '\0' , 0x30, '\x30' 等等到底是什么东西
离线roywillow

只看该作者 9楼 发表于: 2011-08-15
其实QByteArray从某种意义上讲是一种字符串,所以输出默认都会当做字符串一样处理,要通过toHex来获得其中内容的hex形式
文档上注意一下的话你会发现有这么一句:Inherited by: Q3CString
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线gaojinwei
只看该作者 10楼 发表于: 2011-08-15
谢谢roywillow 的回答,这个数据是从硬件读出来的,我只不过要进行后续的处理,抱歉不能上传和大家分享。
今天对QByteArray的理解有了质的飞跃,谢谢大家!
离线skyarmy
只看该作者 11楼 发表于: 2011-08-19
mark一下!
快速回复
限100 字节
 
上一个 下一个