文件读写

来源:互联网 发布:数据分析师培训课程 编辑:程序博客网 时间:2024/06/15 22:59

    文件操作是应用程序必不可少的部分。Qt 作为一个通用开发库,提供了跨平台的文件操作能力。Qt 通过QIODevice提供了对 I/O 设备的抽象,这些设备具有读写字节块的能力。下面是 I/O 设备的类图:


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

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

    在所有的 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的有关操作:

#include "wenjian.h"#include <QApplication>#include <QFile>#include <QFileInfo>#include <QIODevice>#include <QTextCodec>#include <QDebug>#include <QStringList>#include <QString>int main(int argc, char *argv[]){    QApplication a(argc, argv);    QFile file("C:\\Users\\Eric\\Desktop\\1.txt");    //使用open()函数打开这个文件,打开形式是只读方式,文本格式    if(!file.open(QIODevice::ReadOnly|QIODevice::Text)){        qDebug() << "Open file failed.";        return -1;    }else{        QTextStream stream(&file);        QStringList lines;        QString line;        stream.setCodec( QTextCodec::codecForName("GB2312"));//中文转码        while(!stream.atEnd()){            // 一行一行读取,不包括“/n”的一行文本,也可以用readAll()全部读取            //QTextStream 也可以直接把内容输出到 QString            line = stream.readLine();            qDebug()<< line; //输出到“应用程序输出”窗口。            lines += line;        }    }    /*     * QFileInfo 有很多类型的函数。比如这里, isDir()检查该文件是否是目录;isExecutable()检查     * 该文件是否是可执行文件等。 baseName()可以直接获得文件名; suffix()则直接获取文件后缀名。    */    QFileInfo info(file);    qDebug() << info.isDir();    qDebug() << info.isExecutable();    qDebug() << info.baseName();    qDebug() << info.completeBaseName();    qDebug() << info.suffix();    qDebug() << info.completeSuffix();    file.close();    QStringList lines2;    lines2.append("123");    lines2.append("456");    lines2.append("呵呵");    QFile file2( "D:\\1.txt" );    if ( file2.open( QIODevice::WriteOnly ) ) {//只写模式        QTextStream stream2(&file2);        for (auto it = lines2.begin(); it != lines2.end(); ++it )            stream2 << *it << "\r\n";        file2.close();    }    return a.exec();}
    枚举值 描述
QIODevice::NotOpen 未打开
QIODevice::ReadOnly 以只读方式打开
QIODevice::WriteOnly 以只写方式打开
QIODevice::ReadWrite 以读写方式打开
QIODevice::Append 以追加的方式打开,新增加的内容将被追加到文件末尾
QIODevice::Truncate 以重写的方式打开,在写入新的数据时会将游标设置在文件开头
QIODevice::Text 在读取时,将行结束符转换成 \n;在写入时,将行结束符转换成本地格式,例如 Win32 平台上是 \r\n
QIODevice::Unbuffered 忽略缓存


原创粉丝点击