4-3 读取和保存(Loading and Saving)
来源:互联网 发布:js 中window事件 编辑:程序博客网 时间:2024/05/23 02:08
4-3 读取和保存(Loading and Saving)
我们使用QFile和QDataStream来实现Spreadsheet文件的保存和读取。这两个类都是提供了平台无关的二进制I/O。
首先是保存文件的代码:
bool Spreadsheet::writeFile(const QString &fileName)
{
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly)) {
QMessageBox::warning(this, tr("Spreadsheet"),
tr("Cannot write file %1: %2.")
.arg(file.fileName())
.arg(file.errorString()));
return false;
}
QDataStream out(&file);
out.setVersion(QDataStream::Qt_4_1);
out << quint32(MagicNumber);
QApplication::setOverrideCursor(Qt::WaitCursor);
for (int row = 0; row < RowCount; ++row) {
for (int column = 0; column < ColumnCount; ++column) {
QString str = formula(row, column);
if (!str.isEmpty())
out << quint16(row) << quint16(column) << str;
}
}
QApplication::restoreOverrideCursor();
return true;
}
{
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly)) {
QMessageBox::warning(this, tr("Spreadsheet"),
tr("Cannot write file %1: %2.")
.arg(file.fileName())
.arg(file.errorString()));
return false;
}
QDataStream out(&file);
out.setVersion(QDataStream::Qt_4_1);
out << quint32(MagicNumber);
QApplication::setOverrideCursor(Qt::WaitCursor);
for (int row = 0; row < RowCount; ++row) {
for (int column = 0; column < ColumnCount; ++column) {
QString str = formula(row, column);
if (!str.isEmpty())
out << quint16(row) << quint16(column) << str;
}
}
QApplication::restoreOverrideCursor();
return true;
}
函数writeFile()由MainWindow::saveFile()调用把文件保存到磁盘上。如果保存成功返回true,否则返回false。
首先我们使用给定的程序名创建一个QFile对象,调open()打开这个文件准备写入。同时创建QDataSteam对象将数据写入文件中。
在写数据之前,我们将程序的光标换成等待形式,数据写完后恢复原来的鼠标。函数退出时,QFile的析构函数把文件自动关闭。
QDataStream支持基本的C++类型,也支持多种Qt类型。语法和标准C++<iostream>类是一样的。例如:
Out<<x<<y<<z;把变量x,y,z写入数据流。
In>>x>>y>>z; 从数据流中读取数据到x,y,z中。在不同的平台上,基本的C++类型如short,char,int,long,long long会有不同的字长。最好把它们转换为qint8,quint8,qint16,quint16,qint32,quint32,qint64,quint64,这些类型能确保字长是不随平台改变的。
Spreadsheet程序的文件格式非常简单。Spreadsheet程序开头部分是一个32位的标识数字(MagciNumber,在spreadsheet.h中定义的,一个二进制的随机数),这个数字后面是一系列的数据块,友一个行号,列号和公式组成。为了节省空间,不保存空的网格。
数据类型的二进制表示由类QDataStream决定。如:quint16表示位两个字节。一个QString类型表示是字符创的长度和每一个字母的Unicode码组成。
自Qt1.0以来,Qt数据类型的二进制表示有了很大变化。在未来的Qt版本中还可能有更多的改变,QDataStream使用最近的Qt版本,但是它可以读取以前的版本。为了程序用新的Qt版本重新编译后能够更好的兼容,我们显式的给出QDataStream使用的版本为7(QDataStream::Qt_4_1定义为常量7)
QDataStream可以支持多种类型。如QFile,QBuffer,QProcess,QTcpSocket或者QUdpSocket。Qt还提供了类QTextStream能够读写文本文件。第12章详细介绍这些类。
读取文件如下:
bool Spreadsheet::readFile(const QString &fileName)
{
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly)) {
QMessageBox::warning(this, tr("Spreadsheet"),
tr("Cannot read file %1: %2.")
.arg(file.fileName())
.arg(file.errorString()));
return false;
}
QDataStream in(&file);
in.setVersion(QDataStream::Qt_4_1);
quint32 magic;
in >> magic;
if (magic != MagicNumber) {
QMessageBox::warning(this, tr("Spreadsheet"),
tr("The file is not a Spreadsheet file."));
return false;
}
clear();
quint16 row;
quint16 column;
QString str;
QApplication::setOverrideCursor(Qt::WaitCursor);
while (!in.atEnd()) {
in >> row >> column >> str;
setFormula(row, column, str);
}
QApplication::restoreOverrideCursor();
return true;
}
{
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly)) {
QMessageBox::warning(this, tr("Spreadsheet"),
tr("Cannot read file %1: %2.")
.arg(file.fileName())
.arg(file.errorString()));
return false;
}
QDataStream in(&file);
in.setVersion(QDataStream::Qt_4_1);
quint32 magic;
in >> magic;
if (magic != MagicNumber) {
QMessageBox::warning(this, tr("Spreadsheet"),
tr("The file is not a Spreadsheet file."));
return false;
}
clear();
quint16 row;
quint16 column;
QString str;
QApplication::setOverrideCursor(Qt::WaitCursor);
while (!in.atEnd()) {
in >> row >> column >> str;
setFormula(row, column, str);
}
QApplication::restoreOverrideCursor();
return true;
}
函数readFile()和writeFile()很相似。这次文件的打开方式为QIODevice::ReadOnly而不是QIODevice::writeOnly。设置QDataStream的版本为7。写文件和读文件的版本必须一致。
如果文件的magic number号是正确的,调用clear()清空所有的表格,因为文件中只是保存了非空的网格数据,不能保证所有的网格都会设置,然后再读取网格数据。- 4-3 读取和保存(Loading and Saving)
- (转)4.3加载和保存(Loading and Saving)
- (转)4.3加载和保存(Loading and Saving)
- canvas 状态的保存和恢复 Saving and restoring state
- weka中Saving and loading Trained models
- Saving and Loading the Checklist Items
- iOS extracts: Saving and Loading Game State
- !!!Obj-c on Mac --- Chapter 15 File Loading and Saving
- Saving and Loading the State of Multitasking Apps(多任务应用中,状态变化的处理)
- (五)Saving Data保存数据
- 13Saving Files(保存文件到手机内存和外存储设备上)
- EF学习和使用(五)Lazy Loading and Eager Loading
- Saving Files(保存文件)
- Saving Files 保存文件
- 保存和读取文件
- 读取和保存图片
- 文件保存和读取
- 文件保存和读取
- GDC07的一些看法
- The Linux MTD, JFFS HOWTO - (第1部分) HOWTO
- VB.net 2005实现TCP网络通信例程(.net VS2005)源码
- CnPackTip#3:认识静态数组 array[m,n] of x
- 简易数据库代码生成工具 V1.0 发布
- 4-3 读取和保存(Loading and Saving)
- 祈求
- 有多少项目可以重来?-谈谈临时项目组的项目重述
- ACE学习笔记(三)--消息队列(操作)
- C#读取设备信息(源代码下载)
- Find your Root File System with MTD
- 每天一个免费的共享软件
- C#教程电子书
- netTiers New Query Builder Classes