zoukankan      html  css  js  c++  java
  • 一篇文章快速搞懂Qt文件读写操作

    导读:Qt当中使用QFile类对文件进行读写操作,对文本文件也可以与QTextStream一起使用,这样读写操作会更加简便。QFileInfo可以用来获取文件的信息。QDir可以用于对文件夹进行操作。

    本文字数:1000,阅读时长大约:10分钟



    一、文件读操作

    (1)使用QFile类

    Qt封装了QFile类,方便我们对文件进行操作,可以按照如下的步骤进行:

    • 使用QFile加载文件对象
    • 打开文件 file.open(打开方式)
    • 操作文件
    • 关闭文件 file.close()

      

    使用QFile首先用只读方式打开一个文本文件,然后用readAll()方法将文件内容一次全部读取出来,返回值是字节数组QByteArray。QByteArray用来存放二进制数据,如果想要看文字内容需要转换成QString。 

     

        QString path = QFileDialog::getOpenFileName(this, "打开文件", "D:\temp\");
        QFile file(path);
        if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            return;
        }
    
        QByteArray allArray = file.readAll();
        QString allStr = QString(allArray);
        file.close();

      

    Qt默认使用utf-8的编码方式,在Linux中一般没有问题,因为Linux默认也是用utf-8。不过Windows里一般用的是gb18030,所以除非我们明确将文件保存成utf-8编码,否则在Qt代码里需要对编码做一些转换操作:

        QString path = QFileDialog::getOpenFileName(this, "打开文件", "D:\temp\");
        QFile file(path);
        if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            return;
        }
    
        QByteArray allArray = file.readAll();
        QTextCodec *codec = QTextCodec::codecForName("gb18030");
        QString allStr = codec->toUnicode(allArray);
        file.close();

      

    我们也可以使用readLine方法一次读取一行,然后每次对一行文字进行操作:

        QString path = QFileDialog::getOpenFileName(this, "打开文件", "D:\temp\");
        QFile file(path);
        if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            return;
        }
    
        while(!file.atEnd())
        {
            QByteArray array = file.readLine();
            QString str = QString(array);
        }
        file.close();

      

    (2)使用QTextStream类

    如果操作的是文本文件,Qt还专门封装了一个处理文本流的类,我们可以一行一行的读取文本内容

        QString path = QFileDialog::getOpenFileName(this, "打开文件", "D:\temp\");
        QFile file(path);
        if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            return;
        }
    
        QTextStream in(&file);
        //in.setCodec("utf-8");
        while (!in.atEnd())
        {
            QString line = in.readLine();
        }
        file.close();

    二、文件写操作

    (1)使用QFile类

    使用QFile同样可以对文件进行写操作:

        QString path = QFileDialog::getSaveFileName(this, "保存"
                                                    , "D:\temp\", "TXT(*.txt)");
        QFile file(path);
        file.open(QIODevice::WriteOnly | QIODevice::Text);
        file.write("你好");
        file.close();

      

    (2)使用QTextStream类

    QTextStream类对操作符进行了重载,我们可以通过 << 操作符将字符串流入文本文件:

        QString path = QFileDialog::getSaveFileName(this, "保存"
                                                    , "D:\temp\", "TXT(*.txt)");
        QFile file(path);
        file.open(QIODevice::WriteOnly | QIODevice::Text);
        QTextStream out(&file);    
        QString str = "你好";
        out << str;
        file.close();

     

    三、文件信息读取

    除了对文件的读写操作,Qt还封装了QFileInfo类帮助我们获取文件的元数据,比如文件大小、后缀名、创建时间、最后修改时间等等:

        QString path = QFileDialog::getOpenFileName(this, "打开文件", "D:\temp\");
        QFileInfo file(path);
        qDebug() << "文件名" << file.fileName();
        qDebug() << "后缀名" << file.suffix();
        qDebug() << "文件大小" << file.size();
        qDebug() << "创建日期" << file.birthTime().toString("yyyy/MM/dd hh:mm:ss");
        qDebug() << "最后修改" << file.lastModified().toString("yyyy/MM/dd hh:mm:ss");

    四、文件夹的操作

    QDir类可以对路径/文件夹/目录进行操作(不同的系统有不同的名称)。首先我们可以用QDir表示绝对路径,比如:

        QDir("/home/user/Documents")
        QDir("C:/Documents and Settings")

    也可以表示相对路径,比如:

    QDir("images/landscape.png")

    我们可以用IsRelative()和IsAbsolute()方法来检验某个QDir对象使用的是绝对路径还是相对路径。不管用的是哪一种,两者之间也可以相互转化:

    QDir directory("Documents/Letters");
    QString path = directory.filePath("contents.txt");
    QString absolutePath = directory.absoluteFilePath("contents.txt");

      

    我们经常用到QDir的例子有比如检查某个路径是否存在:

        QDir dir("example");
        if (!dir.exists())
        {
            qWarning("Cannot find the example directory");
        }

      

    或者查找某个路径下的文件:

        QDir dir = QDir::root();                 // "/"
        if (!dir.cd("tmp"))                     // "/tmp"
        {
            qWarning("Cannot find the "/tmp" directory");
        }
        else
        {
            QFile file(dir.filePath("ex1.txt")); // "/tmp/ex1.txt"
            if (!file.open(QIODevice::ReadWrite))
            {
                qWarning("Cannot create the file");
            }
        }

    五、文件夹的操作

    Qt对文件和文件夹的操作封装了很多类,比如对文件操作可以使用QFile,文本文件的读写可以使用QTextStream,读取文件元数据可以使用QFileInfo,文件夹的操作可以使用QDir等。这些类为开发者提供了极大的便利,还有很多方法本文不能一一介绍到,感兴趣的读者也可以查阅Qt的帮助文档。

     

     

    推荐阅读:

    Qt信号与槽使用方法最完整总结

    C++最好的图形库是什么?

    Linux快速搭建C/C++开发环境

     

     

    获取知识干货、增加面试经验、了解职场人生

    欢迎关注微信公众号

     


  • 相关阅读:
    MO 中的imagelayer
    GDAL之OGR入门(转载)
    OGR体系结构
    C++与C# 以及指针
    如何用C#编程实现动态生成Word文档并填充数据?
    C++的类与C#的类[zt]
    arcmap vba 实现“卫星立体测图”高度字段值的计算,今天的一点小成就
    lib 和 dll from baidu
    ping and netstat
    Visual Basic6.0 中的类模块和标准模块
  • 原文地址:https://www.cnblogs.com/jfzhu/p/13546886.html
Copyright © 2011-2022 走看看