一篇文章快速搞懂Qt文件读写操作

2023-05-16

已剪辑自: https://www.cnblogs.com/jfzhu/p/13546886.html

导读: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++最好的图形库是什么?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一篇文章快速搞懂Qt文件读写操作 的相关文章

  • Google软件工程:什么是软件工程

    文章目录 编程 软件工程软件工程的3个特性时间与变化海勒姆定律 xff08 Hyrum s Law xff09 目标不是 没有变化 规模和效率左移思维 权衡和成本最后 已剪辑自 https mp weixin qq com s GhYfH3
  • 多普勒失真信号重采样的Matlab仿真分析

    多普勒失真信号重采样的Matlab仿真分析 应用场景 水声通信指的是使用声信号在水中传输数据 相对而言 xff0c 电磁信号在水中吸收严重衰减过快 xff0c 光信号受水中悬浮颗粒的影响 xff0c 也无法完成远距离传输 这两种信号的传播距
  • 嵌入式为何钟爱SourceInsight,主要因为这个功能~

    已剪辑自 https mp weixin qq com s F gafwbZswpnY8EaCz8HxQ 不管是玩单片机还是嵌入式linux xff0c 只要是与硬件结合比较紧密的部分目前基本上还是C语言 xff0c 当然了 xff0c 不
  • 华科师兄最近的六条感悟

    已剪辑自 https mp weixin qq com s P6vz2zDTnCNli0GdyKX98Q 孤独之前是迷茫 孤独之后便是成长 曾经我是一个无法承受孤独的人 xff0c 无法和自己独处 xff0c 喜欢喧嚣的感觉 慢慢我发现这种
  • 一个优秀的程序员应该养成哪些好的习惯?

    文章目录 一 写代码前先想好思路 xff0c 先规划框架 xff0c 再到局部实现二 注重代码风格三 注重代码执行效率四 掌握一些编码原则五 解决问题时 xff0c 对于原理性的问题 xff0c 不要面向搜索引擎编程 六 注重基础知识的学习
  • 嵌入式开发中的防御性C语言编程

    嵌入式产品的可靠性自然与硬件密不可分 xff0c 但在硬件确定 并且没有第三方测试的前提下 xff0c 使用防御性编程思想写出的代码 xff0c 往往具有更高的稳定性 防御性编程首先需要认清C语言的种种缺陷和陷阱 xff0c C语言对于运行
  • PPT 最后一页写什么结束语既得体又能瞬间提升格调?

    谢邀 xff01 我只分享一个现下最流行的方法 xff0c 绝对让尾页逼格满满 xff01 罗永浩雷军都在用的 金句法 提到这份方法 xff0c 你可能会觉得很陌生 xff0c 但你一定见过这样的页面 xff1a 这样的页面还有很多 xff
  • Qt控件和事件

    文章目录 什么是 Qt 控件什么是Qt事件总结 已剪辑自 http c biancheng net view vip 9651 html Qt 是一个著名的 GUI 框架 xff0c 用来开发和用户交互的图形界面 作为 GUI 框架 xff
  • Qt信号和槽机制详解

    文章目录 信号和槽connect 函数实现信号和槽实例演示信号和槽机制 已剪辑自 http c biancheng net view vip 9652 html 信号和槽是 Qt 特有的消息传输机制 xff0c 它能将相互独立的控件关联起来
  • Qt QLabel文本框的使用

    文章目录 QLabel文本框的使用QLabel文本框的信号和槽实例演示QLabel文本框的用法 已剪辑自 http c biancheng net view vip 9653 html QLabel 是 Qt 帮我们写好的一个控件类 xff
  • Qt QPushButton按钮用法详解

    文章目录 QPushButton按钮的创建QPushButton按钮的使用QPushButton按钮的信号和槽实例演示QPushButton按钮用法 已剪辑自 http c biancheng net view vip 9654 html
  • Qt QLineEdit单行输入框用法详解

    已剪辑自 http c biancheng net view vip 9655 html QLineEdit 是 Qt 提供的一个控件类 xff0c 它直接继承自 QWdiget 类 xff0c 专门用来创建单行输入框 xff0c 如下图所
  • 使用python开发json、csv数据格式转换工具

    使用python开发json csv数据格式转换工具 json和xml是业界常用的数据格式 xff0c 而游戏行业经常使用csv配表 xff0c 包括本地化文本和数值 本文介绍csv和json序列化 逆序列化相关的python库 xff0c
  • 【学习QT必备的C++基础】C++类和对象

    文章目录 C 43 43 类的定义和对象的创建详解类的定义创建对象访问类的成员使用对象 指针 http c biancheng net c 80 总结 C 43 43 类的成员变量和成员函数详解在类体中和类体外定义成员函数的区别 C 43
  • 【学习QT必备的C++基础】C++引用精讲,C++ &用法全面剖析

    文章目录 C 43 43 引用10分钟入门教程C 43 43 引用作为函数参数C 43 43 引用作为函数返回值 C 43 43 引用在本质上是什么 xff0c 它和指针到底有什么区别 xff1f 引用和指针的其他区别 C 43 43 引用
  • 【学习QT必备的C++基础】C++继承、派生与多态

    文章目录 C 43 43 继承和派生简明教程C 43 43 三种继承方式public protected private 修饰类的成员public protected private 指定继承方式改变访问权限 C 43 43 继承时的名字遮

随机推荐

  • QT中组件/控件类的关系

    一 常见类继承关系 二 窗口类继承关系 Qt中窗口类的继承关系 说明 xff1a QWidge继承自QObject和QPaintDevice类 QObject是支持QT对象模型的基类 Qt Object Model QPaintDevice
  • Qt QListWidget列表框用法详解

    文章目录 QListWidget列表框的创建QListWidgetItem列表项 QListWidget列表框的使用QListWidget列表框的信号和槽实例演示QListWidget列表框的用法 已剪辑自 http c biancheng
  • Qt QTreeWidget树形控件用法详解

    文章目录 QTreeWidget控件的创建QTreeWidget QTreeView的关系和区别QTreeWidgetItem类 QTreeWidget的实际应用1 添加结点2 给结点添加图标3 给结点添加复选框4 多列树形控件5 QTre
  • Qt QMessageBox用法详解

    文章目录 通用的QMessageBox消息框1 information消息对话框2 critical消息对话框3 question消息对话框4 warning消息对话框5 about和aboutQt对话框 自定义QMessageBox对话框
  • Qt pro文件详解

    文章目录 pro文件中的配置信息QT配置项 已剪辑自 http c biancheng net view vip 9661 html 默认情况下 xff0c 每个 Qt 项目都包含一个后缀名为 pro 名称和项目名相同的文件 xff0c 我
  • mac上用qt创建应用 运行后为什么不显示窗体

    mac上安装了qt xff0c 新建mainwindow窗体应用 xff0c 运行后在程序坞出现了一个图标 xff0c 但是无法显示窗体 解决方法 xff1a 软件配置的SDK远大于电脑配置的SDK xff0c 下个低的版就好了
  • Qt Designer基础控件介绍

    已剪辑自 https blog csdn net qq 37631516 article details 104786627 1 布局类 xff08 4种 xff09 2 固定弹簧类 2种 xff08 不随布局变化 xff09 3 按钮类
  • python开发环境管理:pip和virtualenv

    python开发环境管理 xff1a pip和virtualenv 不同的python软件需要不同的开发环境 xff0c 互相之间甚至可能有冲突 xff0c 怎么处理 xff1f 使用pip virtualenv和virtualenvwra
  • Qt QFile文件操作详解

    文章目录 QFile文件操作QFile 43 QTextStreamQFile 43 QDataStream 文件操作是非常重要的 xff0c 是数据持久化的方法 通过文件操作 xff0c 我们可以把在软件中设置的数据保存起来 已剪辑自 h
  • Qt布局管理详解(5种布局控件)

    文章目录 QVBoxLayout垂直布局QHBoxLayout水平布局QGridLayout网格布局QFormLayout表单布局QStackedLayout分组布局 已剪辑自 http c biancheng net view vip 9
  • 基于优先级的时间片轮转调度算法(C语言实现)

    已剪辑自 http www demodashi com demo 15341 html 基于优先级的时间片轮转调度算法 1 PCB结构 xff08 Block xff09 由此定义如下结构体 xff1a span class token k
  • Qt自定义信号和槽函数

    文章目录 自定义信号函数自定义槽函数自定义信号和槽的完整实例 已剪辑自 http c biancheng net view vip 9662 html 实际开发中 xff0c 如果仅使用 Qt 提供的信号函数和槽函数 xff0c 会经常遇到
  • QT中信号和槽之间的参数传递和参数匹配

    已剪辑自 https blog csdn net lyc daniel article details 12047819 信号槽如何传递参数 xff08 或带参数的信号槽 xff09 利用Qt进行程序开发时 xff0c 有时需要信号槽来完成
  • QT使用信号与槽时编译错误“no matching function for call to connect“

    转转于 xff1a http t csdn cn K3aYh 初学QT xff0c 在尝试用connect手动关联一个按钮和QlineEdit的时候编译报错 xff0c 如下 xff1a 然后贴上主要代码块 xff1a span class
  • QT-QTableWidget中的cell和item的区别

    文章目录 QTableWidget中单击一个单元格响应不同的函数 xff1a cell和item的区别 xff1a 单击单元格响应自定义函数我的错误思路 xff1a 已剪辑自 https blog csdn net CCLasdfg art
  • QT开发网络调试助手项目总结

    之前整理了一些使用QT开发串口调试助手的项目 博客地址 xff1a 上位机总结 这次继续整理一些使用QT开发网络调试助手的项目 Qt开源作品41 网络调试助手增强版V2022 我的QT学习之路 xff0c 编写UDP 43 tcp网络调试助
  • QT开源项目总结-总有一款适合你

    Qt Open Source Project 开源项目推荐 xff1a 本人收集的有关Qt的GitHub Gitee开源项目 精品收藏 我的Qt作品 Github上的一些高分Qt开源项目 Qt编写项目作品大全 Qt 开源作品
  • Qt 打印调试信息-怎样获取QTableWidget的行数和列数-读取QTableWidget表格中的数据

    文章目录 Qt 打印调试信息怎样获取QTableWidget的行数和列数Qt怎么把QTableWidget表格中的数据读取出来 Qt 打印调试信息 打印当前目录代码如下 xff0c 别忘了头文件 include include lt QtD
  • VR游戏交互开发的一些体验

    VR游戏交互开发的一些体验 本文主要写Unity开发手游过程中VR交互输入控制的一些浅薄的经验交互方面 xff0c 头控和视线按钮依然较为主流 xff0c 可以获得传感器数据来获得输入除了实体按钮输入之外还可以探索其他交互方式 xff0c
  • 一篇文章快速搞懂Qt文件读写操作

    已剪辑自 https www cnblogs com jfzhu p 13546886 html 导读 xff1a Qt当中使用QFile类对文件进行读写操作 xff0c 对文本文件也可以与QTextStream一起使用 xff0c 这样读