Qt中对文件读写操作

2023-10-29

Qt中自己定义一套对文件的读写操作:QFile
常用的读写模式如下:

  • QIODevice::ReadOnly:文件以只读的形式打开
  • QIODevice::WriteOnly:文件以写的形式打开,该方式写入的新内容会覆盖掉之前的内容。
  • QIODevice::ReadWrite:文件以读写的方式打开
  • QIODevice::Append:文件以追加的方式打开,新写入的内容会被添加到文件的末尾,原来的内容会被保留
  • QIODevice::Text:将每行的结束字符根据具体的环境转换成对应的形式,一般都附带该项
  • QIODevice::Truncate:以截断的方式来打开文件
  • QIODevice::NotOpen:文件没有被打开

一、创建一个窗口程序来选择某一路径下的文件,读取其所有内容

Qt 默认支持格式为UTF-8,如果读取的文件为GBK或者ANSI格式,则需要特别设置读取文件格式。

1、ui页面的设置布局
  • 首先分别添加控件LineEditTextEditPushButtonWidget 。其中LineEditPushButton位于Widget控件中。其整体竖直布局,结果如下:
    在这里插入图片描述
2、使用readAll一次读取所有内容的代码实现如下:

在这里插入图片描述

3、运行的结果如图:

(1)、读取UTF-8格式文件,正常显示如下:

在这里插入图片描述

(2)、读取gbk格式文件时,中文字体将出现乱码,如下图:在这里插入图片描述

4、根据文件编码类型设置对应的编码格式

(1)、设置读取读取编码格式的类为QTextCodec,修改的代码部分如下:
在这里插入图片描述
(2)、运行结果gbk格式文件可以正常读取,但utf-8将会出现乱码

在这里插入图片描述
在这里插入图片描述


二、逐行读取文件内容

  • readLine()逐行读取,并保留换行符等格式。
  • atEnd()判断是否到文件的末尾结束位置
1、以逐行的形式读取文件的全部内容,

(1)、具体代码如下

在这里插入图片描述
(2)、读取的文件全部内容如下:

在这里插入图片描述

2、只读取文件前面几行

(1)、如读取文件前 8 8 8 行,代码如下:

在这里插入图片描述
(2)、运行的结果如下,只显示前 8 8 8行:

在这里插入图片描述

3、只读取文件后面几行

(1)、读取文件后8行,mainwindow.cpp代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QFileDialog> //用于弹出文件对话框,供选择文件
#include<QFile> //用于读取文件内容
#include<QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //点击选取文件按钮,打开文件对话框
    connect(ui->btnPath,&QPushButton::clicked,this,[=]{
       QString filePath = QFileDialog::getOpenFileName(this,"打开文件","D:\\Temp");
       //将文件的绝对路径放到 lineEdit
       ui->lineEdit->setText(filePath);

       //将文件的内容读取出来,显示到 TextEdit 上
       QFile file(filePath);//该对象用来计算总的行数
       QFile file2(filePath);//该对象用来打印具体的数据
       //对绑定的文件进行操作,首先设置打开的方式为只读
       file.open(QIODevice::ReadOnly);
       file2.open(QIODevice::ReadOnly);

       //逐行读取文件内容,以字节数组的形式来保存
       QByteArray arr;
       //统计总的行数
       int linesNum=0;
       while(!file.atEnd())
       {
           arr=file.readLine();
           ++linesNum;
       }
	   file.close();
	   
       //要打印末尾的行数
       int printCounts=8;

       //总的行数小于待打印的行数时,全部打印出来。
       if(linesNum<=printCounts)
       {
           while(!file2.atEnd())
           {
               arr+=file2.readLine();
           }
       }
       else
       {
           int curIndex=linesNum-printCounts+1;
           while(curIndex)
           {
               arr=file2.readLine();
               --curIndex;
           }
           while(!file2.atEnd())
           {
               arr+=file2.readLine();
           }
       }

       //将文件内容显示出来。QByteArray 可以直接转换成 QString
       ui->textEdit->setText(arr);
	
	   file2.close();
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

(2)、运行结果如下,只显示后8行:

在这里插入图片描述


三、读取文件方法总结

1、直接读取文件的内容
  • 使用QFile类的readLine()或者readAll()函数来进行读取
  • readLine()readAll()属于类QIODevice,其返回值类型为QByteArray
  • QByteArray可以直接转换成QString
/****** 测试代码如下 *********/
#include "ReadFile.h"

#include<qfile.h>
#include<qdebug.h>
#include<iostream>
#include<qstring.h>

ReadFile::ReadFile(QWidget *parent)
    : QMainWindow(parent)
{
    //在VS中的Qt项目中,ui的类型是类的对象,而在QtCreator中ui的类型是指针
    //在两种IDE中其调用的方式有些许的差别。
    ui.setupUi(this);

    QString fileName = "D:\\WSpace\\TheData\\TestResult\\TestRecord.txt";
    QFile file(fileName);

    if (!file.exists())
    {
        qDebug() << "The file is not exist!" << endl;
        return;
    }
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return;

    QByteArray line01, line02;

    while (!file.atEnd())
    {
        line01 += file.readLine(); //逐行读取的方式读取全部内容。
    }


    line02 = file.readAll();//一次读取全部内容。

    ui.textEdit->setText(line01);

    file.close();
}

在这里插入图片描述

2、通过Streams流来读取文件内容
  • 通过QTextStream类的readLine()或者readAll()函数来进行读取
  • readLine()readAll()在此属于类QTextStream,其返回值类型为QString类型
  • 这种方式与原始的C++中的流方法相同,将文件绑定到流对象上,通过流对象来进行操作文件
#include "ReadFile.h"
#include<qfile.h>
#include<qdebug.h>
#include<iostream>
#include<qstring.h>

ReadFile::ReadFile(QWidget *parent)
    : QMainWindow(parent)
{

    ui.setupUi(this);

    QString fileName = "D:\\WSpace\\TheData\\TestResult\\TestRecord.txt";
    QFile file(fileName);

    if (!file.exists())
    {
        qDebug() << "The file is not exist!" << endl;
        return;
    }
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return;

    QTextStream in(&file);//将文件绑定到流对象上

    QString line01, line02;
    while (!in.atEnd())
    {
        line01 += in.readLine();//逐行读取文件内容
    }

    line02 = in.readAll();//一次全部读取文件内容

    ui.textEdit->setText(line01);

    file.close();
}


四、向文件中写入内容

1、QFile直接写入内容
  • 利用QFilewrite()函数直接进行写入操作
  • write()函数是QFile类继承自QIODevice类而来的
  • 该方法写入前会先自动判断是否存在目标文件,若没有就会自动创建,并写入内容
  • 默认是以UTF-8的格式写入数据
#include "QtWriteFile.h"
#include<qfile.h>
#include<qtextstream.h>


QtWriteFile::QtWriteFile(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
	//创建对象并绑定到对应文件
    QString fileName = "D:\\Temp\\writeFile03.txt";
    QFile file(fileName);
	//设定文件的打开方式
    file.open(QIODevice::Append | QIODevice::Text);
    //向文件中写入内容
    file.write("Hello this is just a write test.\nThanks ....!\n");

    file.close();
}

在这里插入图片描述

2、利用Streams流来写入内容
  • QTextStream流重载了<<符号,可以直接用该符号来写入内容
  • 可以直接通过setCodec()设定流的编码方式
  • 当指定的文件不存在时,会自动创建对应的文件并写入内容
  • 也可以通过控制台来写入内容

(1)、在程序内部不通过控制台写入内容:

#include "QtWriteFile.h"
#include<qfile.h>
#include<qtextstream.h>


QtWriteFile::QtWriteFile(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

    //创建文件对象,并用指定文件进行初始化
    QString fileName = "D:\\Temp\\writeFile.txt";
    QFile file(fileName);

    //设置文件的打开方式
    file.open(QIODevice::Append | QIODevice::Text);

    //创建流对象,并将其绑定到对应文件上
    QTextStream out(&file);

    //设置文件的写入编码格式
    out.setCodec("UTF-8");

    //写入文件的内容
    QString strContent = "Hello this is just a test for QTextStream.\n";
    out << strContent;
    out << "Qt Project " << 99 << "\n";

    file.close();
}

(2)、通过控制台来交互的写入内容:

  • 输入输出流的格式有,stdin:输入流;stdout:输出流;stderr:输出错误信息
  • 通过QTextStream创建流对象,并设定为输入流
  • readLineInto():每次可以输入一行的内容,以换行符作为结束符。返回值为bool类型
  • >>每次输入以空格作为结束符
#include "QtWriteFile.h"
#include<qfile.h>
#include<qtextstream.h>
#include<qdebug.h>


QtWriteFile::QtWriteFile(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

    //创建文件对象,并用指定文件进行初始化
    QString fileName = "D:\\Temp\\writeFile.txt";
    QFile file(fileName);

    //设置文件的打开方式
    file.open(QIODevice::Append | QIODevice::Text);

    //创建流对象,并将其绑定到对应文件上,用于向其写入数据
    QTextStream out(&file);

    //创建流对象,并设定其为输入流
    QTextStream in(stdin);
    QString strContent;

    //设置文件的写入编码格式
    out.setCodec("UTF-8");

    qDebug() << "Please input some string for test: " << endl;

    //in >> strContent;//每次遇到空格就结束
    //out << strContent;//将控制台的输入内容,写入到文件中


    in.readLineInto(&strContent);//每次可以输入一行内容,以换行符作为结束符
    qDebug() << strContent << endl;
    out << strContent;

    file.close();
}

结果如下:

在这里插入图片描述
在这里插入图片描述

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

Qt中对文件读写操作 的相关文章

  • 由于 QCoreApplication 事件循环,QThread 永远不会退出

    Problem 所以我有一个 CommandRetriever 类来保存一些命令 并且should在不同的线程上执行这些命令 class CommandRetriever public CommandRetriever CommandRet
  • Qt 5.4/Qml:防止绑定循环

    我有一个全局单例 设置 它保存应用程序设置 当我尝试运行以下代码时 我得到一个QML CheckBox Binding loop detected for property checked CheckBox checked Settings
  • C++ 是否可以延迟常量静态成员的初始化?

    我正在使用 Qt 但这是一个通用的 C 问题 我的情况很简单 我有一个课程Constants它有一个常量静态成员 我希望在进行某些函数调用后对其进行初始化 常量 h ifndef CONSTANTS H define CONSTANTS H
  • App Store 上是否允许嵌入 dylib 的 iOS 8 应用程序?

    iOS 8 现在支持动态框架 是否意味着 App Store 提交允许这样做 似乎以前的开发人员能够在内部应用程序中使用 dylib 但在提交到 App Store 的内容中使用它们会导致您被拒绝 情况仍然如此 还是 iOS 8 中的这一更
  • qmake 和 QT_INSTALL_PREFIX。如何为 Qt 库选择新位置?

    我是 qmake 的新手 我正在尝试构建一个现有的应用程序 Qt 最初安装在 usr local lib Qt 4 3 5 中 qmake query QT INSTALL PREFIX 返回该路径 我已将 Qt 库移动到另一个位置 生成的
  • QOpenGLFunctions 缺少重要的 OpenGL 函数

    QOpenGLFunctions 似乎缺少重要的函数 例如 glInvalidateFramebuffer 和 glMapBuffer 据我了解 QOpenGLFunctions 加载桌面 OpenGL 函数和 ES 函数的交集 如果是这样
  • Qt5 CMake 将所有库包含到可执行文件中

    我正在尝试使用 Qt 5 14 构建一个发布模式下的应用程序 并且 Qt Creator 内部一切正常 但是当我尝试单独运行可执行文件时 我收到如下错误 OS Windows 10 Qt 5 14 Cmake 3 5 我尝试过的 设置 CM
  • 如何使小部件溢出以使滚动条出现在 Qt 中?

    我的小部件的结构是 QWidget 定制为带有圆角边框的面板 要在边界内包含一个带有滚动条并带有边距的区域 然后我将其放入其中 QScrollArea 与 QVBoxLayout 垂直添加内容 然后我在其中添加一系列 标题间距为 0 的 Q
  • QWebView / Qt WebKit 不会打开某些 SSL 页面;不允许重定向?

    在带有 Visual C 2008 SP1 的 Windows 7 上全新安装 Qt SDK 1 1 4 我正在使用 Qt Creator 为什么此代码无法加载某些网页 include
  • 使用带有 MSVC 2015 编译器的 QT Creator 5.8

    我是新来的C 和编程 我正在尝试做一个小项目 使用Qt and Qt Creator 我当时用的是MinGW compiler 但对于这个项目 我需要与MSVC compiler 因为我需要使用QtWebEngineWidgets I ha
  • Qt Creator 中的按钮是否有隐藏属性?

    Qt Creator 属性托盘中是否有按钮的隐藏属性 我想找到一个 但找不到 我需要禁用一些按钮并隐藏一些按钮 我应该使用属性托盘还是在构造函数中进行 稍后在用户事件中 它们将被启用并显示 有些控件在调色板上具有 可见性 属性 有些则没有
  • Qml 中的 FileDialog 在发布中不起作用

    我正在与以下项目合作Qt Quick Control 2 当我尝试在调试模式下运行软件时 FileDialog qml 可以完美打开 但是当我将其部署为发布模式时 它无法工作 这是我的代码 import QtQuick 2 4 import
  • 是否可以在切换 QTreeWidgetItem 复选框时创建信号?

    我使用下面的代码创建了一个也是 QTreeWidgetItem 的复选框 Populate list QTreeWidgetItem program createCheckedTreeItem QString fromStdString i
  • Qt Designer 与手动编码

    每次我使用图形工具包开始一个项目时 第一个冲突就会发生在如何处理视觉设计和小部件布局的决定上 图形工具还是手动编码 这是一个非常棘手 主观的问题 因为大多数人会根据个人喜好来决定 它还很大程度上取决于图形工具的质量 在这种情况下 我想只关注
  • 无法初始化静态QList?

    我收到以下错误 Cube cpp 10 error expected initializer before lt lt token 以下是头文件的重要部分 ifndef CUBE H define CUBE H include
  • QT“找不到 Qt 平台插件“xcb””

    我出于学术原因安装了QT everywhere 5 15开源版 但无法运行程序 首先 我编译了必要的源文件make并安装了QT Creator 然后我选择qmake来运行其中的程序 当我尝试运行示例程序时 遇到以下错误 qt qpa plu
  • 在 Qt C++ 中使用多个键

    我正在构建 坦克 游戏 我使用关键事件在地图上运行我的坦克 实际上我当时只能使用一把钥匙 但我需要有能力去完成任务 同时向上和离开 这是我的单键事件代码 switch event gt key case Qt Key Up if ui gt
  • QT 应用程序运行时错误?

    我已经在 Windows 7 的 Qt5 1 上开发了一个应用程序 现在我想分发它 由于我使用了 MINGW 编译器 因此无法静态构建它 我使用dependency walker找出所有dll并打包 当我在未安装 QT 开发环境的计算机上运
  • QToolBar 的菜单延迟

    我通过制作 QAction 并向其添加 QMenu 在 QToolBar 上有一个菜单 如何消除单击图标时出现菜单之前的延迟 QToolBar myToolBar new QToolBar this QAction myAction new
  • cx_freeze:QODBC 驱动程序未加载

    我的 python 应用程序如下所示 test py from PyQt4 import QtCore from PyQt4 import QtGui from PyQt4 import QtSql import sys import at

随机推荐

  • Windows平台如何查看一个dll依赖的其他dll

    好多开发者在做windows开发的时候 容易遇到dll依赖的问题 VS自带一个小工具dumpbin 这个工具挺好用 可以查看dll相关依赖库 还可以看dll导出接口 下面演示下查依赖库用法 运行 dumpbin dependents nm
  • axios相应拦截器弹窗的实现

    在axios中同一封装 将请求之后code不等于0的数据进行弹窗显示 在封装axios的时候 通过require导入elementUI 之后调用message方法 import axios from axios var ui require
  • 【Jmeter线程组及报告解析】

    前言 一 线程组解析 1 含义 2 案例 3 各类线程执行顺序 二 报告解析 1 常用的压测报告 2 View Results Tree 介绍 3 Aggregate Report 聚合报告 介绍 前言 本章主要针对压测时常用的 线程组 压
  • 【FPGA IP系列】FIFO的通俗理解

    FPGA厂商提供了丰富的IP核 基础性IP核都是可以直接免费调用的 比如FIFO RAM等等 本文主要介绍FIFO的一些基础知识 帮助大家能够理解FIFO的基础概念 一 FIFO介绍 FIFO全称是First In First Out 即先
  • Unity热更新 ILRuntime 从零开始 继承 Inheritance(五)

    Unity热更新 ILRuntime 从零开始 继承 Inheritance 五 前言 一 继承分类 二 跨域继承的用法 1 继承适配器 2 实际应用 总结 版权声明 前言 我们继续来一起看下ILRuntime的第四个案例 Inherita
  • Java一键授权方案 离线授权 日期授权 代码授权 代码混淆

    Java软件部署到客户端 有时没外网 有时需要对模块时效进行控制 但是通常一般性的lic号注册 很容易被破解 屏蔽 不能保证软件的版权和收益 中小型软件又不能再安全方面投入太大 这时该如何做授权功能呢 我现在向您介绍的是一套具体的授权加密方
  • Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by

    使用node js连接mysql数据库报如下错误 Error ER NOT SUPPORTED AUTH MODE Client does not support authentication protocol requested by s
  • 8、抽象类、接口、多态、向上转型、向下转型

    一 final关键字 1 可以修饰变量 方法 类 2 修饰变量时 变量的值不能再改变 成为一个常量 3 修饰方法时 被修饰的方法不能被修改 4 修饰类时 这个类不能被继承 并且类中的成员方法会隐式地被final修饰 5 当final修饰一个
  • stm32 ucos/ii移植,程序执行到OSStart()内部的OSStartHighRdy()语句时跑飞问题解决方法之一

    stm32 ucos ii移植 程序执行到OSStart 内部的OSStartHighRdy 语句时跑飞问题解决办法之一 网络上的一些解决办法 stm32程序遇到OSStartHang的问题解决方法总结 但并不适合我遇到的情况 我的情况是已
  • WebSocket服务端数据推送及心跳机制(Spring Boot + VUE)

    一 WebSocket简介 HTML5规范在传统的web交互基础上为我们带来了众多的新特性 随着web技术被广泛用于web APP的开发 这些新特性得以推广和使用 而websocket作为一种新的web通信技术具有巨大意义 WebSocke
  • android 倒计时 界面,Android实现倒计时结束后跳转页面功能

    前言 在开发中会经常用到倒计时这个功能 关于倒计时的实现 有疑问的朋友们可以参考这篇 https www jb51 net article 101807 htm 本文主要给大家介绍了关于Android倒计时结束跳转页面的相关内容 分享出来供
  • 部署k8s动态持久卷nfs报错如下:waiting for a volume to be created, either by external provisioner “gxf-nfs-storag

    报错如下 waiting for a volume to be created either by external provisioner gxf nfs storage or manually created by system adm
  • 使用UniFlash闪存编程工具为TM4C129x芯片写入MAC地址

    对MAC地址进行检查和编程 网络上的每个 NIC 网络接口控制器 都必须由一个 MAC 地址唯一标识 以便在网段内进行通信 MAC 地址是一个 48 位值 表示为两个十六进制数字的六个八位字节 MAC 地址主要由设备制造商来分配 前三个八位
  • IPsec 认证头协议(IPsec AH)--网络大典

    IPsec 认证头协议 IPsec AH 是 IPsec 体系结构中的一种主要协议 它为 IP 数据报提供无连接完整性与数据源认证 并提供保护以避免重播情况 一旦建立安全连接 接收方就可能会选择后一种服务 AH 尽可能为 IP 头和上层协议
  • 关于refid的使用

    关于refid的使用 首先定义一个id 然后通过refid通过id将之前定义的内容进行引用 这样适用于同一字符串被大量引用的时候应用 具体代码如下
  • 主线剧情01-ARM-IMX6ULL基础学习记录

    ARM i MX6ULL 基础学习记录 编辑整理 by Staok 本文大部分内容摘自 100ask imx6ull 开发板的配套资料 如 IMX6ULL裸机开发完全手册 等等 侵删 进行了精髓提取 方便日后查阅 过于基础的内容不会在此提及
  • 贵金属交易中做空操作注意事项

    贵金属投资项目流行的原因之一就是其囊括的种类多 这让不同的投资者都可以找到适合自己的投资项目 而且具体到贵金属交易的时候往往形式也很多 比如像伦敦金等产品都可以进行做空操作 而今天就来说说进行做空操作需要注意的地方 第一 提到贵金属交易中的
  • osgFBO(十四)PrerenderOrder的使用

    由于前面是简单的demo 所以不用管渲染次序 然而 实际项目中 会出现多种渲染方式 这时候就要用到 camera gt setRenderOrder osg Camera PRE RENDER 还要加上具体次序 比如 采样摄像机设为2 处理
  • 以太网数据格式与封装解封——以太网基础02

    我们在上一文中介绍了以太网5层模型 这一节我想学习一下以太网数据封装与解封的知识 了解以太网数据是如何传输的 一 数据封装 当我们应用程序用TCP传输数据的时候 数据被送入协议栈中 然后逐个通过每一层 知道最后到物理层数据转换成比特流 送入
  • Qt中对文件读写操作

    Qt中自己定义一套对文件的读写操作 QFile 常用的读写模式如下 QIODevice ReadOnly 文件以只读的形式打开 QIODevice WriteOnly 文件以写的形式打开 该方式写入的新内容会覆盖掉之前的内容 QIODevi