Qt QT的I/O流 QT输入输出

本文详细介绍了Qt中使用QDataStream和QFile进行二进制文件读写的实现方法,包括自定义文件格式的保存与读取,以及使用QTextStream进行文本文件的读写操作。通过具体代码示例,展示了如何高效地处理文件IO操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. QFile QDataStream 读写文件  二进制读写文件

#include <QApplication>  
#include <QtGui>  
#include <QtDebug>  
  
int main(int argc, char *argv[])  
{  
    QMap<QString, QColor> map;  
    map.insert("red", Qt::red);  
    map.insert("green", Qt::green);  
    map.insert("bule", Qt::blue);  
  
    QFile file("123.txt");  
    if( !file.open(QIODevice::WriteOnly) )  
        qDebug() << "open file fail";  
  
    QDataStream out(&file);  
    out.setVersion(9);  
    out << quint32(0x12345678) << map;  
}  
#include <QApplication>  
#include <QtGui>  
#include <QtDebug>  
#include <iostream>  
  
int main(int argc, char *argv[])  
{  
    QFile file("123.txt");  
    if( !file.open(QIODevice::ReadWrite) )  
        qDebug() << "open file fail";  
  
    QDataStream in(&file);  
    in.setVersion(9);  
    QString str1, str2;  
    in >> str1 >> str2;  
  
    qDebug() << str1 << str2;  
}  

2. QDataStream实例 

我们使用自定义的二进制格式来实现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())
                             .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对象,将数据写入文件中。

在写数据之前,我们将程序的光标换成等待形式,数据写完后恢复原来的鼠标形状。函数结束时,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)
{
    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()清空所有的表格,因为文件中只是保存了非空的单元格数据,不能保证所有的单元格都会被设置,所以必须确保再读取单元格数据前所有的表格要清空。

 

3. QTextStream 文件读写

#include <QApplication>  
#include <QtGui>  
#include <QtDebug>  
#include <iostream>  
  
int main(int argc, char *argv[])  
{  
    QFile file("456.txt");  
    if( !file.open(QIODevice::ReadWrite) )  
        qDebug() << "open file fail";  
    QTextStream out(&file);  
    out << "1234" << endl <<"5678" << endl;  
    file.close();  
  
    if( !file.open(QIODevice::ReadWrite) )  
        qDebug() << "open file fail";  
    QTextStream in(&file);  
    QString str1, str2;  
    str1 = in.readLine();  
    in >> str2;  
    qDebug() << str1 << str2;  
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值