Qt学习 之 文件

文件操作是应用程序必不可少的部分。Qt 作为一个通用开发库,提供了跨平台的文件操作能力。从本章开始,我们来了解下 Qt 的文件以及输入输出的功能,也就是 I/O 系统。

Qt 通过QIODevice提供了对 I/O 设备的抽象,这些设备具有读写字节块的能力。下面是 I/O 设备的类图:

Qt4

Qt5

从上面的类图可以看出,Qt4 和 Qt5 在 I/O 设备部分大同小异。只不过 Qt5 新增加了一个QFileDevice类。途中所涉及的类及其用途简要说明如下:

类名 作用
QIODevice 所有 I/O 设备类的父类,提供了字节块读写的通用操作以及基本接口
QFlie 访问本地文件或者嵌入资源
QTemporaryFile 创建和访问本地文件系统的临时文件
QBuffer 读写QByteArray
QProcess 运行外部程序,处理进程间通讯
QAbstractSocket 所有套接字类的父类
QTcpSocket TCP协议网络数据传输
QUdpSocket 传输 UDP 报文
QSslSocket 使用 SSL/TLS 传输数据
QFileDevice Qt5新增加的类,提供了有关文件操作的通用实现

这其中,QProcess、QTcpSocket、QUdpSoctet和QSslSocket是顺序访问设备。所谓“顺序访问”,是指它们的数据只能访问一遍:从头走到尾,从第一个字节开始访问,直到最后一个字节,中途不能返回去读取上一个字节;QFile、QTemporaryFile和QBuffer是随机访问设备,可以访问任意位置任意次数,还可以使用QIODevice::seek()函数来重新定位文件访问位置指针。

本章将主要介绍QFile及其相关类,后面的章节则开始介绍有关输入输出的流。

在所有的 I/O 设备中,文件 I/O 是最重要的部分之一。因为我们大多数的程序依旧需要首先访问本地文件(当然,在云计算大行其道的将来,这一观点可能改变)。QFile提供了从文件中读取和写入数据的能力。Qt5 新加入的QFileDevice类,则将这部分公共操作放到了这个单独的类中。显然,这部分代码在 Qt4 中位于QFile类。这样看来,Qt5 的代码结构更为清晰,层次更好。

我们通常会将文件路径作为参数传给QFile的构造函数。不过也可以在创建好对象最后,使用setFileName()来修改。QFile需要使用 / 作为文件分隔符,不过,它会自动将其转换成操作系统所需要的形式。例如 C:/windows 这样的路径在 Windows 平台下同样是可以的。

QFile主要提供了有关文件的各种操作,比如打开文件、关闭文件、刷新文件等。我们可以使用QDataStream或QTextStream类来读写文件,也可以使用QIODevice类提供的read()、readLine()、readAll()以及write()这样的函数。值得注意的是,有关文件本身的信息,比如文件名、文件所在目录的名字等,则是通过QFileInfo获取,而不是自己分析文件路径字符串。

下面我们使用一段代码来看看QFile的有关操作:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QFile file("in.txt");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qDebug() << "Open file failed.";
        return -1;
    } else {
        while (!file.atEnd()) {
            qDebug() << file.readLine();
        }
    }

    QFileInfo info(file);
    qDebug() << info.isDir();
    qDebug() << info.isExecutable();
    qDebug() << info.baseName();
    qDebug() << info.completeBaseName();
    qDebug() << info.suffix();
    qDebug() << info.completeSuffix();

    return app.exec();
}

在这段代码中,我们首先使用QFile创建了一个文件对象。这个文件名字是 in.txt。如果你不知道应该把它放在哪里,可以使用app.applicationFilePath();或者app.applicationDirPath();来获得应用程序的执行路径。只要将这个文件放在同执行路径一致的目录下即可。可以使用QDir::currentPath()来获得应用程序执行时的当前路径。只要将这个文件放在与当前路径一致的目录下即可。然后,我们使用open()函数打开这个文件,打开形式是只读方式,文本格式。这个类似于fopen()的 r 这样的参数。open()函数返回一个 bool 类型,如果打开失败,我们在控制台输出一段提示然后程序退出。否则,我们利用while 循环,将每一行读到的内容输出。

程序的第二部分,我们使用QFileInfo获取有关该文件的信息。QFileInfo有很多类型的函数,我们只举出一些例子。比如这里,isDir()检查该文件是否是目录;isExecutable()检查该文件是否是可执行文件等。baseName()可以直接获得文件名;suffix()则直接获取文件后缀名。我们可以由下面的示例看到,baseName()completeBaseName(),以及suffix()completeSuffix()的区别:

QFileInfo fi("/tmp/archive.tar.gz");
QString base  = fi.baseName();  // base = "archive"
QString cbase = fi.completeBaseName();  // base = "archive.tar"
QString ext   = fi.suffix();  // ext = "gz"
QString ext   = fi.completeSuffix();  // ext = "tar.gz"

http://blog.csdn.net/u013007900/article/details/46459535
时间: 2024-10-27 04:25:10

Qt学习 之 文件的相关文章

[QT学习]拷贝文件

sourceDir源绝对路径,toDir目标绝对路径 1 //拷贝文件: 2 bool FileOperation::copyFileToPath(QString sourceDir ,QString toDir, bool coverFileIfExist) 3 { 4 toDir.replace("\\","/"); 5 if (sourceDir == toDir){ 6 return true; 7 } 8 if (!QFile::exists(source

qt学习(一)qt三个文件函数的框架

学到点什么, 而不是复制着什么, 每天敲着别人给的代码,苦涩得改完bug, 就这样一天天的过去, 实质上并没有学到什么, 别人的思想只是拿来借鉴, 你的思想是好是坏都是你的, 不用急着抛弃自己. 从qt看看人家的思路. Qt编程思路: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~` 以下:xxx.h ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Qt学习之路

  Qt学习之路_14(简易音乐播放器) Qt学习之路_13(简易俄罗斯方块) Qt学习之路_12(简易数据管理系统) Qt学习之路_11(简易多文档编辑器) Qt学习之路_10(Qt中statusBar,MessageBox和Timer的简单处理) Qt学习之路_9(Qt中Item Widget初步探索) Qt学习之路_8(Qt中与文件目录相关操作) Qt学习之路_7(线性布局和网格布局初步探索) Qt学习之路_6(Qt局域网聊天软件) Qt学习之路_5(Qt TCP的初步使用) Qt学习之路

qt学习(三):鼠标图标改变

qt学习 (三):鼠标图标改变 当你进入一个美好的qt软件场景,比如游戏,电脑的黑白图标会让程序逊色不少, 1改图标要加光标的头文件, 2 载入光标图, 3 再设置改光标就可以了 1在头文件中加 #include <QtGui>  //光标类的父类 //再在public成员中声明换的函数void keyPressEvent(QKeyEvent *k); //声明按键换图的函数         .h文件    --注意头文件和声明 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Qt学习总结-ui篇(二)

qccs定义圆角 border-radius:10px; 如果想给特定位置定义圆角,如: 左上角:border-left-top-radius:10px; 右下角色:border-right-bottom-rasius:10px; 半透明效果 只需要在css中使用rgba(100,100,100,40)这种形式来表示颜色即可. 为可执行文件添加图标 1.新建文件:finename.rc 文件名无所谓,只要后缀为rc就可以. 2.编辑新建的文件,输入以下内容: IDI_ICON1 ICON DIS

QT学习第1天

QT学习第一天  坚持住!! 一 Qt概述 1.Qt发展历史 (1)1991年诞生(Haavard Nord/Eirik Chambe-Eng), (2)1994年创立Troll Tech(奇趣科技) (3)2005年QT4.0 (4)2008年被Nokia收购 (5)2009年源代码开源 (6)2012年Nokia将全部QT业务和知识产权卖给Digia公司 (7)2013年QT5.0 QT5.1 QT5.2 (8)2014年Digia公司成立 The Qt Company子公司 2.Qt5.4

QT学习笔记—1

1.模态和非模态的区别:非模态可以同时操作两个窗口,模态的只能在顶层窗口关闭之后才能使用其他窗口 //同时显示出widget和dialog窗口,非模态     QDialog *dialog = new QDialog(this);     dialog->show(); //同时显示出widget和dialog窗口,模态     QDialog *dialog = new QDialog(this);     dialog->setModal(true);     dialog->sh

Qt学习一:直接使用QT工具

今天通过直接使用QT的一些工具来编写命令行程序,可以看到一种Qt的更加通用的使用方法. 内容非常简单,输出当前的日期. 首先使用的是QDate类,可以使用QDate类的静态方法currentDate来获得当前日期. 其次,标准库里面的cout已经无法输出QString类型,就此使用QTextStream类来输出.在QTextStream类已经定义了endl和flush等常用变量,可以直接使用. 于是,一个简单的程序就诞生了: #include <QTextStream> #include &l

【qt学习】开篇

重新开始学习qt,在年前已经看过一些知识点,但毫无进展,始终停留在知识点的阶段,或许有qt考试的话,我可以考得不错.然而学习qt,更多的是为了实战应用,并将其变成自己的兵器. 开始学习之前,先说说早前的一个困惑--为什么学习qt?最初学习qt,是因为身边朋友的强烈推荐,他说通过学习图形界面编程可以提高c++编程能力,而图形界面编程无非两种,一种MFC,另一种就qt了,MFC极其变态,想要简单快速,就学qt吧,于是我就开始看qt了.没过多久我有些动摇了,随着互联网时代的来临,编程方式正在慢慢改变,