qtqdatastream读写⽂件
来源:
我们使⽤⾃定义的⼆进制格式来实现Spreadsheet⽂件的保存和读取。我们⽤QFile和QDataStream这两个类来实现,它们⼀起提供了平台⽆关的⼆进制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())
.String()));
return fal;
}
QDataStream out(&file);
out.tVersion(QDataStream::Qt_4_1);
out<< quint32(MagicNumber);
QApplication::tOverrideCursor(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,否则返回fal。
小班美术教案⾸先我们使⽤给定的程序名创建⼀个QFile对象,调open()打开这个⽂件准备写⼊。同时创建⼀个QDataSteam对象来操作QFile对象,将数据写⼊⽂件中。
在写数据之前,我们将程序的光标换成等待形式,数据写完后恢复原来的⿏标形状。函数结束时,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表⽰按big-endian顺序保存为两个字节。⼀个QString类型表⽰是字符串的长度后⾯接着Unicode码组成。
⾃Qt1.0以来,Qt数据类型的⼆进制表⽰有了很⼤变化。在未来的Qt版本中还可能有更多的改变,默认QDataStream使⽤最近的Qt版本的⼆进制格式(version 7 in Qt 4.1),但是它可以读取以前的版本。为了程序⽤新的Qt版本重新编译后能够更好的兼容,我们显式的给出QDataStream使⽤的版本为7(QDataStream::Qt_4_1定义为常量7)
QDataStream可以⽀持多种类型。如QFile,QBuffer,QProcess,QTcpSocket或者QUdpSocket。Qt还提供了类QTextStream能够读写⽂本⽂件。第12章详细介绍这些类。
读取⽂件如下:
bool Spreadsheet::readFile(const QString &fileName)
ps复制粘贴{
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly)) {
QMessageBox::warning(this, tr("Spreadsheet"),
tr("Cannot read file %1: %2.")
.arg(file.fileName())
.String()));玉髓和玉的区别
return fal;
预备党员民主评议
}
QDataStream in(&file);
in.tVersion(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 fal;
}
clear();
quint16 row;
quint16 column;
QString str;
QApplication::tOverrideCursor(Qt::WaitCursor);
while (!in.atEnd()) {
in>> row >> column >> str;
tFormula(row, column, str);
}
QApplication::restoreOverrideCursor();
return true;
}
函数readFile()和writeFile()很相似。这次⽂件的打开⽅式为QIODevice::ReadOnly⽽不是QIODevice::writeOnly。设置QDataStream的版本为7。写⽂件和读⽂件的版本必须⼀致。
如果⽂件的magic number号是正确的,调⽤clear()清空所有的表格,因为⽂件中只是保存了⾮空的单元格数据,不能保证所有的单元格都会被设置,所以必须确保再读取单元格数据前所有的表格要清空。