Qt: 读写二进制文件(写对象, 原始数据等)

#include <iostream>
#include <QFile>
#include <QImage>
#include <QMap>
#include <QColor>

class C {
public:
C(quint32 value = 0) :
value(value) {
}

// Override operator << and >>.
friend QDataStream &operator<<(QDataStream &out, const C &obj);
friend QDataStream &operator>>(QDataStream &in, C &obj);

quint32 getValue() const {
return value;
}

private:
quint32 value;
};

QDataStream &operator<<(QDataStream &out, const C &obj) {
out << obj.value;

return out;
}

QDataStream &operator>>(QDataStream &in, C &obj) {
in >> obj.value;

return in;
}

/**
* Copy a file
*/
bool copy(const QString &source, const QString &dest) {
QFile sourceFile(source);
if (!sourceFile.open(QIODevice::ReadOnly)) {
#ifdef DEBUG
std::cerr << sourceFile.errorString().toStdString() << std::endl;
#endif
return false;
}

QFile destFile(dest);
if (!destFile.open(QIODevice::WriteOnly)) {
#ifdef DEBUG
std::cerr << destFile.errorString().toStdString() << std::endl;
#endif
return false;
}

destFile.write(sourceFile.readAll());

return sourceFile.error() == QFile::NoError && destFile.error()
== QFile::NoError;
}

/**
* Instantiate a QFile
* Open the file
* Access the file through q QDataStream object.
*
* Must ensure that we read all the types in exactly the same order
* as we wrote them.
*
* If the DataStream is being purely used to read and write basic C++ data types,
* we dont‘ even need to call setVersion().
*
* If we want to read or write a file in one go. WE can avoid using QDataStream altogether
* and instead using QIODevice‘s write() and readAll() function.
* For example copy a file.
*/
int main(int argc, char *argv[]) {
//********Write data in to the file.********
QImage image("Adium.png");
QMap<QString, QColor> map;
map.insert("red", Qt::red);
map.insert("green", Qt::green);
C c(23);
QFile file("data.dat");
if (!file.open(QIODevice::WriteOnly)) {
std::cerr << "Cannot open the file: Write." << file.errorString().toStdString() << std::endl;

return 1;
}

QDataStream out(&file);
out.setVersion(QDataStream::Qt_4_3);
out << quint32(7456) << map << c;
file.close();

//********Read data from the file.********
quint32 value;
QMap<QString, QColor> map2;
C c2;
if (!file.open(QIODevice::ReadOnly)) {
std::cerr << "Cannot open the file: Read." << file.errorString().toStdString() << std::endl;

return 2;
}
QDataStream in(&file);
in.setVersion(QDataStream::Qt_4_3);
in >> value >> map2 >> c2;
file.close();

std::cout << value << std::endl << c2.getValue();

copy(QString("Adium.png"), QString("Copy_Adium.png"));

return 0;
}

http://www.cppblog.com/biao/archive/2008/03/19/44810.html

时间: 2024-10-29 19:06:47

Qt: 读写二进制文件(写对象, 原始数据等)的相关文章

Qt读写二进制文件

http://blog.csdn.net/mjlsuccess/article/details/22194653 http://www.cnblogs.com/weiweiqiao99/archive/2010/11/14/1877208.html int PacketDataSaveThread::savePacketData(int id, AVPacket *pkt) { int ret = 0; QString filename; filename.append(QString::num

C/C++读写二进制文件

C++读写二进制文件 最近在给android层提供支持,因此代码都是用标准库库函数写出来的,好多windows和第三方的库不能或者很难使用,下面有我在读写二进制文件时候的一些心得,也算是一种总结吧 1.读二进制信息 1 bool bRet = true; 2 std::ofstream fout(szDestFile, std::ios::binary | std::ios::app); 3 std::ifstream fin(szOrigFile, std::ios::binary); 4 5

C#读写二进制文件

原文 本文要介绍的C#本地读写二进制文件,二进制文件指保存在物理磁盘的一个文件.第一步:读写文件转成流对象.其实就是读写文件流 (FileStream对象,在System.IO命名空间中).File.FileInfo.FileStream这三个类可以将打开文件,并变成文件 流.下面是引用微软对File.FileInfo.FileStream的介绍System.IO.File类 提供用于创建.复制.删除.移动和打开文件的静态方法,并协助创建 FileStream 对象.System.IO.File

C#本地读写二进制文件

本文要介绍的C#本地读写二进制文件,二进制文件指保存在物理磁盘的一个文件. 第一步:读写文件转成流对象.其实就是读写文件流 (FileStream对象,在System.IO命名空间中).File.FileInfo.FileStream这三个类可以将打开文件,并变成文件 流.下面是引用微软对File.FileInfo.FileStream的介绍System.IO.File类 提供用于创建.复制.删除.移动和打开文件的静态方法,并协助创建 FileStream 对象.System.IO.FileIn

【转】C++读写二进制文件

原文网址:http://blog.csdn.net/lightlater/article/details/6364931 摘要: 使用C++读写二进制文件,在开发中操作的比较频繁,今天有幸找到一篇文章,遂进行了一些试验,并进行了部分的总结. 使用C++操作文件,是研发过程中比较频繁的,因此进行必要的总结和封装还是十分有用的.今天在网上找到一篇,遂进行了部分的试验,以记之,备后用. 本文读写文件均使用文件流进行操作,主要使用的类是ifstream, ofstream, 使用时,请务必包含文件fst

[Matlab+C/C++] 读写二进制文件

introduction 由于Matlab操作简单.方便,它被应用于非常多领域:音频处理,图像处理,数值计算等.虽然MATLABeasy操作.但受限于他的语言解释机制.MATLAB的运行速度通常较低.C/C++一般被觉得是运行较为高效的高级程序设计语言. 假设结合MATLAB和C/C++.或许我们能够获得操作简便性和运行速度的折中.这样的结合的一般形式是:MATLAB负责绝大部分工作,C/C++负责一些关键部分的实现.其详细方法在我之前的博文中已经有所介绍. 在处理某些数据的时候,可能涉及到文件

Qt打开外部程序和文件夹需要注意的细节(Qt调用VC写的动态库,VC需要用C的方式输出函数,否则MinGW32编译过程会报错)

下午写程序中遇到几个小细节,需要在这里记录一下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 QProcess *process = new QProcess(this);     QFileInfo fileinfo(appUrl);     QString appPath = QApplication::applicationDirPath()+SAVEDIR+"/"+fileinfo.fileName();     bool res = proce

【Qt 】QSettings写ini配置文件

QSettings写ini配置文件(Qt版本5.2): #include "inidemo.h" #include <QSettings> #include <QTextCodec> IniDemo::IniDemo(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); QSettings settings("setting.ini",QSettings::IniFormat);

c#写对象来读取TXT文本文件

本博文让你知道怎样写对象,怎样读取文本文件,怎样根据实际条件判断与获取需要的文本行.参考下面网友的问题,根据源文来看,有些行输出的格式,需要把“,”替换为空格. 第一行还附加入后面的子行每一行的后面,空格分隔. Insus.NET也参考网友的要求,准备好相似的文本文件数据,不过有所扩展,加多两组. 122 207273-001,A001 207273-003,A001 207273-004,A001 132 207273-051,Q001 207273-053,Q001 207273-054,Q