《QT Creator快速入门》第十五章:文件、目录、I/O

摘要:
QFileInfo是文件信息类,可以获得文件名称、路径、文件类型、访问权限、最近修改时间等信息。//写入数据QFilefile;file.open;QDataStreamout;out˂˂QString;out˂˃str˃˃i;ViewCode如果要串行化自定义的格式,需要在数据流前面写入一个数据头,包含magicnumber和版本号://写入数据QFilefile;file.open;QDataStreamout;out˂˂0xA0B0C0D0;//写入幻数out˂˂123;//写入版本号out.setVersion;//数据流版本号cout˂˃magic;qint32version;in˃˃version;in˃˃myData;ViewCode在《QTCreator快速入门》第十八章网络编程中的TCP客户端、服务器的示例程序中也可以看到QDataStream的应用。在《QTCreator快速入门》第十九章进程中的共享内存的示例中也可以看到QDataStream的应用。

1、QIODevice

QIODevice是QFile、QBuffer、QTcpSocket等I/O设备的基类,可以使用open()打开设备(打开模式如下)、read()/write()进行文件读写、close()关闭设备。

QTcpSocket、QUdpSocket、QProcess等属于顺序存储设备,它们不支持seek()来改变文件指针,QFile、QBuffer属于随机存取设备,可以使用seek()方法。

QFile和QBuffer使用内部缓冲区进行数据的中间存储以减少设备的访问次数来提高效率,可以在open()设备的时候指定QIODevice::Unbuffered来取消缓冲区模式。

可以通过子类化QIODevice来为自己的I/O可以通过子类化QIODevice来为自己的I/O设备提供相同的接口,只需要实现readData()和writeData()两个方法。

2、QFile和QDir

QFile是文件类,其打开的文件名的分隔符需要使用'/',有exists()、remove()等成员方法。QFileInfo是文件信息类,可以获得文件名称(包括基本名称、后缀)、路径、文件类型(文件、目录、符号链接)、访问权限、最近修改时间等信息。

QTemporaryFile是临时文件类,当QTemporaryFile对象销毁的时候文件被自动删除,临时文件所在的路径可以通过QDir::tempPath()来获取。

QDir是目录类,使用'/'作为目录分隔符,可以直接传入带文件名的路径给它,使用它可以获得目录的名称、当前路径、设置新的路径、创建/删除目录、重命名目录等。cd()和cdUp()会跳转到指定目录、上一级目录。count()方法可以返回目录下条目数,entryList()返回条目名称列表,entryInfoList()返回QFileInfo类型的条目列表。还可以设置一个过滤器来过滤目录中文件的列出,如下面的名称过滤器setNameFilters(),多个过滤器可以使用或|来进行组合后使用setFilters()来设置。文件列出的顺序可以通过setSorting()来设置通过名称、大小、时间等排序。静态方法current()、currentPath()可以获得当前工作目录,静态方法drives()获得系统根目录,可以通过QCoreApplication::applicationDirPath()来获得当前应用程序所在目录。

QFileSystemWatcher提供了对文件或目录的监控,调用addPath()来监视一个文件或目录,当文件、目录被修改、重命名、删除后会发射fileChanged()、directoryChanged()信号。

3、QTextStream

QIODevice配合QTextStream可以很方便的对文本进行读写,QTextStream还可以在QString和QByteArray上使用:

    QFile file("output.txt");
    if(file.open(QFile::ReadWrite |QFile::Truncate))
    {
        QTextStream outStream(&file);
        //写入字符串"Result: 3.14      2.7       ";
        outStream << "Result: " << qSetFieldWidth(10) << left << 3.14 << 2.7;

        QTextStream inStream(&file);
        while(!inStream.atEnd())
        {
            //读取一行字符
            QString line =inStream.readLine();
        }
    }

    QString str("hello world!");
    QTextStream in(&str);
    //读取一个单词到s
QString s;
    in >>s;
    //读取一个字符到ch
QChar ch;
    in >> ch;
View Code

QTextStream内部使用一个基于unicode的缓冲区,默认的使用QTextCodec::codecForLocale()返回的编码来进行读写,可以使用setCodec()来设置编码。

当从文本流中读取数字时QTextStream会自动判断数字使用的基数(进制),如果以0x开头则会被认为是16进制,可以使用dec等流操作符或setIntegerBase()来设置整数基数从而停止自动检测。

4、QDataStream

QIODevice配合QDataStream可以实现串行化操作,其支持的类型有int、char*等基本类型和QString、QDateTime、QBrush等Qt类型(Qt帮助的Serializing Qt Data Types关键字对应的文档列出了支持的所有Qt类型)。读取和写入Qt类型数据应该使用相同的数据流版本,可以使用setVersion()来明确使用的数据流的版本号。

//写入数据
    QFile file("file.dat");
    file.open(QIODevice::WriteOnly);
    QDataStream out(&file);
    out << QString("test");
    out << (qint32)42;

    //读取数据
QFile file(file.dat);
    file.open(QIODevice::ReadOnly);
    QDataStream in(&file);
    QString str;
    qint32 i;
    in >> str >> i;
View Code

如果要串行化自定义的格式,需要在数据流前面写入一个数据头,包含magic number和版本号:

//写入数据
    QFile file("file.xxx");
    file.open(QIODevice::WriteOnly);
    QDataStream out(&file);
    out << (quint32)0xA0B0C0D0; //写入幻数
    out << (qint32)123; //写入版本号

    out.setVersion(QDataStream::Qt_4_0); //数据流版本号
cout <<myData;

    //读取数据
    QFile file("file.xxx");
    file.open(QIODevice::ReadOnly);
    QDataStream in(&file);

    quint32 magic;
    in >>magic;
    qint32 version;
    in >>version;

    in >> myData;
View Code

在《QT Creator快速入门》第十八章 网络编程中的TCP客户端、服务器的示例程序中也可以看到QDataStream的应用。

在《QT Creator快速入门》第十九章 (1) 进程 中的共享内存的示例中也可以看到QDataStream的应用。

5、QBuffer和QByteArray

QByteArray通过QBuffer可以使用QIODevice接口,如下所示:

    //QBuffer来向QByteArray写入数据
QByteArray byteAry;
    QBuffer buf(&byteAry);
    buf.open(QIODevice::WriteOnly);
    QDataStream out(&buf);
    out <<QApplication::palette();

    //从QByteArray读取数据
    QBuffer buf(&byteAry);
    buf.open(QIODevice::ReadOnly);
    QDataStream in(&buf);
    QPalette palette;
    in >> palette;
View Code

当有新的数据可从设备读取的时候,QIODevice会发射readyRead()信号,通过管理这个信号可以使用QBuffer来存储临时的数据,而后再对它们进行处理。可以在Qt帮助中查看Shared Memory Example示例程序。

6、其它类

QSetting类提供了持久的应用程序设置功能,类似在windows系统注册表中存储应用程序的设置信息,它基于QVariant,可以保存大多数基于值的类型,如QString、QRect、QImage等。

QUrl是URL类,可以传入一个url样式的QString给它,提供了操作URL的接口,如设置协议、设置用户名等。URL可以表示为编码和未编码两种格式,编码格式用于发送到服务器,未编码格式用于向用户展示。

QUrlInfo存储了URL的相关信息,包括文件名、权限、组、修改日期等。关于QUrl和QUrlInfo的使用可以参考FTP Example示例。

QResource类提供了接口来直接读取资源文件,QResource也可以使用一个绝对路径进行加载,绝对路径可以使用文件系统表示法,以一个‘/’开始,或者使用资源表示法,以':'开始,数据也可以使用qCompress()来进行压缩,使用qUncompress()解压缩。一个资源可以等运行需要它时再使用registerResource()来加载,传递给它的资源文件必须是rcc生成的二进制资源,二进制资源的更多内容可以在Qt帮助中参考The Qt Resource System关键字。

免责声明:文章转载自《《QT Creator快速入门》第十五章:文件、目录、I/O》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Wireshark——过滤器Jackson替换fastjson下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

操作笔记:linux下安装mysql

1,检查linux下是否安装了mysql shell指令如下: [root@iZ945sgm0ugZ ~]# rpm -qa|grep -i mysql 如果有的话:做出挨个删除(eg:rpm -ev mysql-connector-odbc-5.2.5-6.el7.x86_64) [root@iZ945sgm0ugZ ~]# rpm -qa|grep -...

Git忽略提交规则

在使用Git的过程中,我们喜欢有的文件比如日志,临时文件,编译的中间文件等不要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些文件的提交。简单来说一个场景:在你使用git add .的时候,遇到了把你不想提交的文件也添加到了缓存中去的情况,比如项目的本地配置信息,如果你上传到Git中去其他人pull下来的时候就会和他本地的配置有冲突,所以这样的个性化...

Weblogic的安装、配置与应用部署

1. Weblogic安装 1.1 Linux下安装过程 安装环境: 操作系统: redhat-release-5Server-5.4.0.3 Weblogic版本: Weblogic 9.24 1)       部署前准备: 创建weblogic用户组. groupadd weblogic useradd –g weblogic weblogic pas...

如何配置wamp多站点主机

Wamp配置多主机方法wampserver多站点多目录详细配置 找到httpd.conf文件中的Include conf/extra/httpd-vhosts.conf,取消行首的# 并添加或修改以为下标签的代码: <Directory /> Options Indexes FollowSymLinks AllowOverride All...

C#中的release和debug模式

以下内容来源:https://www.cnblogs.com/rgjycs/p/9254332.html 在程序调试时的debug和release 网上有如下的描述:Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好...

iPad新手必看-各种文件存放路径详解[转]

iPad运行的iOS系统和我们平时使用的Windows有这巨大的不同,包括文件存储方式上,iOS有着严格的目录规划,对于想更大程度扩展iPad系能的朋友来所,知晓iPad系统常用文件存放路径是必不可少的,下面是小编收集到的ipad各种文件存放路径详解,希望对iPad新手有所帮助。   1、【/Applications】   常用软件的安装目录   2. 【...