C++——QT 文件操作类

news2025/5/29 6:31:54

QFile 概述

QFile是Qt框架中用于文件操作的类(位于QtCore模块),继承自 QIODevice,提供文件的读写、状态查询和路径管理功能。它与 QTextStreamQDataStream 配合使用,可简化文本和二进制数据的处理,并具备跨平台兼容性。

文件操作类 QFile

主要功能:

  • 文件读写QFile 支持打开文件进行读取或写入操作
  • 文件信息:可以检索有关文件的信息,如大小、修改日期等。
  • 文件操作:提供了对文件进行重命名、移动、删除等操作的能力。
  • 错误处理QFile 在操作文件时提供了错误处理机制,可以通过相应的函数检查和获取错误息。

常用方法:

  • open() :打开一个文件。需要指定模式(如只读、只写、读写等)。
  • close() :关闭文件。
  • read() write() :用于读取和写入数据。
  • exists() :检查文件是否存在。
  • remove() :删除文件。
  • copy() :复制文件。

QFile读取文件数据

创建一个按钮 “读取文件” 当按钮被点击时,会打开指定路径的文件 test.txt ,将该文件的内容读取出来并打印。

创建一个按钮,并转为槽,信号选择clicked。

以上两个函数(QFile、QFile(const QString &name))二选一 

widget.cpp

#include "widget.h"
#include "ui_widget.h"

#include <QFile>
#include <QDebug>

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

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


void Widget::on_btnRead_clicked()
{
    // 1.打开文件
    // 方式一:
    // QFile myFile("D:/C++Pro/test.txt"); 创建QFile对象并设置文件路径为绝对路径D:/C++Pro/test.txt
    
    // 方式二:
    // 创建QFile对象并设置文件路径为绝对路径D:/C++Pro/test.txt
    QFile myFile;
    myFile.setFileName("D:/C++Pro/test.txt");
    
    // 判断 open 返回值,返回 true 文件成功打开,返回 false 打开失败,后续的操作(如:read,write)均无效
    if( !myFile.open(QIODevice::ReadOnly | QIODevice::Text) ) // open 以只读和文本模式打开。
    {
        qDebug() << "文件打开失败";
    }

    // 2.读取数据
    char cData[100] = {'\0'};
    // 如果返回-1,表示读取发生错误,直接return程序结束
    if( myFile.read(cData, 100) == -1 ) 
        return;
    // 3.输出数据
    qDebug() << cData;
    // 4.关闭
    myFile.close();
}

open 在 QIODevice 里面,所以需要进入 QIODevice 里面查找 open 的访问权限。

QFile 继承于 QFileDevice,QFileDevice 继承于 QIODevice。在 QIODevice 里面找到 Member Type Documentation,如下图:

QFile创建并写入文件

同样,创建一个按钮 “写入文件” 当按钮被点击时,会在指定的路径创建文件 test2.txt ,将该数据写入文件中。

创建一个按钮,并转为槽,信号选择clicked。

widget.cpp

#include "widget.h"
#include "ui_widget.h"

#include <QFile>
#include <QDebug>

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

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


void Widget::on_btnWrite_clicked()
{
    // 1.打开文件
    QFile file("D:/C++Pro/test2.txt"); // 创建QFile对象并设置文件路径为绝对路径
    if( !file.open(QIODevice::WriteOnly | QIODevice::Text)) // open 以只写模式和文本模式打开文件。
                                            // QIODevice::WriteOnly:文件不存在则创建,存在则覆盖。
                                            // QIODevice::Text:自动处理换行符(如Windows中将\n转换为\r\n)。
    {
        qDebug() << "文件创建失败";
    }
    // 2.写入数据
    // 将字符串写入文件,若写入失败(返回-1)则直接返回。
    if( file.write("This is the first file I created using QT") == -1 )
    {
        return;
    }
    // 3.关闭文件
    file.close();
}

QTextStream

QTextStream 的主要特性成一个表格:

QTextStream 是一个功能强大的类,用于处理文本数据,特别是在需要考虑字符编码和文本格式化的情况下。通过这些特性,它提供了一种灵活而强大的方式来读写和操作文本。

编程示例:

以下是一个更详细的示例,展示了如何使用 QTextStream 来读写文件:

#include "widget.h"
#include "ui_widget.h"

#include <QFile>
#include <QDebug>

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

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


void Widget::on_stramWrite_clicked()
{
    QFile file("D:/C++Pro/test2.txt");

    if( !file.open(QIODevice::WriteOnly | QIODevice::Text) )
    {
        qDebug() << "error file";
        return;
    }

    QTextStream out(&file);
    // 设置字符编码格式为:UTF-8
    out.setCodec("UTF-8");
    // 向文件写入数据
    out << "hello QT";

    // 关闭文件
    file.close();
}

void Widget::on_streamRead_clicked()
{
    QFile file("D:/C++Pro/test.txt"); // QFile 对象(file)与文件名的路径关联

    if( !file.open(QIODevice::ReadOnly | QIODevice::Text) ) // 显式调用 open() 打开文件
    {
        qDebug() << "error file";
    }

    QTextStream in(&file); // 将已打开的 QFile 对象传给 QTextStream,使其能操作文件内容。

    // 设置字符编码格式
    in.setCodec("UTF-8");
    // 读取文件中每行的数据
    while ( !in.atEnd() ) {
        QString str = in.readLine();
        qDebug() << str;
    }

    // 关闭文件
    file.close();
}

setCodecatEnd 和 readLine 三个 API 的详细解释

setCodec

函数原型:setCodec(const char *codecName)

作用

设置文本流的字符编码格式,用于读写文本时的编码/解码。例如,将文本编码设为 UTF-8GBK 或 ISO-8859-1

参数
  • codecName:字符串形式的编码名称(如 "UTF-8""GBK")。

使用场景
  • 当需要确保文本文件以特定编码(如 UTF-8)保存时。

  • 解决跨平台或跨语言环境下的乱码问题。

编程示例
QFile file("data.txt");
file.open(QIODevice::WriteOnly);
QTextStream out(&file);
out.setCodec("UTF-8");          // Qt5 及之前版本
out << "你好,Qt!";            // 写入 UTF-8 编码的中文
注意事项
  • Qt 版本差异

    • Qt5 及之前:使用 setCodec("UTF-8")

    • Qt6setCodec 被弃用,改用 setEncoding(QStringConverter::Utf8)

  • BOM 问题

    • Windows 记事本依赖 BOM(字节顺序标记)识别 UTF-8 文件。若需兼容,需启用 BOM:

      out.setGenerateByteOrderMark(true);  // 添加 BOM
  • 读写一致性:读取文件时需使用相同的编码,否则会乱码。

atEnd 

函数原型:bool atEnd() const

作用

检查当前流是否已读取到末尾(没有更多数据可读)。

返回值
  • true:流已到末尾,无数据可读。

  • false:流中仍有数据。

使用场景
  • 在循环中逐行读取文件时,作为循环终止条件。

  • 避免在无数据时继续读取导致错误。

编程示例
QFile file("data.txt");
file.open(QIODevice::ReadOnly);
QTextStream in(&file);
in.setCodec("UTF-8");  // 设置编码与写入时一致

while (!in.atEnd()) {   // 循环直到文件末尾
    QString line = in.readLine();
    qDebug() << line;
}
注意事项
  • 并非实时更新atEnd() 的状态在每次读取操作后更新。

  • 二进制文件:对二进制流(如 QDataStream)可能不适用。

  • 性能:频繁调用 atEnd() 无性能问题,因内部缓冲机制高效。

readLine

函数原型:QString readLine(qint64 maxlen = 0)

作用

从流中读取一行文本,直到遇到换行符(\n 或 \r\n)或文件末尾。

参数
  • maxlen(可选):最大读取长度。若设为 0(默认),读取整行。

返回值
  • QString:读取的一行文本(不包含换行符)。

  • 若流已到末尾,返回空字符串。

使用场景
  • 逐行读取文本文件(如日志、CSV、配置文件)。

  • 处理用户输入的逐行命令。

编程示例
QFile file("data.txt");
file.open(QIODevice::ReadOnly);
QTextStream in(&file);
in.setCodec("UTF-8");

QString line;
while (!(line = in.readLine()).isNull()) {  // 逐行读取
    processLine(line);  // 处理每行数据
}
注意事项
  • 换行符处理

    • 自动忽略换行符(\n 或 \r\n)。

    • 返回的字符串中不包含换行符。

  • 空行:若某行仅包含换行符,返回空字符串。

  • 性能:适合大文件处理,因逐行读取减少内存占用。

  • 编码一致性:需确保读取编码与文件实际编码一致。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2387163.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[spring] spring 框架、IOC和AOP思想

目录 传统Javaweb开发的困惑 loC、DI和AOP思想提出 Spring框架的诞生 传统Javaweb开发的困惑 问题一&#xff1a;层与层之间紧密耦合在了一起&#xff0c;接口与具体实现紧密耦合在了一起 解决思路&#xff1a;程序代码中不要手动new对象&#xff0c;第三方根据要求为程序提…

尚硅谷redis7 37-39 redis持久化之AOF简介

37 redis持久化之AOF简介 AOF 以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工…

GitLab 备份所有仓库(自动克隆)

一、准备工作 1. 环境要求 已安装 Git&#xff08;版本 2.10&#xff09;本地磁盘空间充足&#xff08;根据仓库总大小预估&#xff09;已配置 SSH 密钥到 GitLab&#xff08;推荐方式&#xff09; 2. 获取 GitLab API 访问权限 登录 GitLab&#xff0c;点击右上角头像 → …

[浏览器]缓存策略机制详解

在做页面性能优化的时候&#xff0c;有一个点容易被忽略&#xff0c;那就是资源缓存优化。 浏览器里缓存策略分为强缓存&#xff0c;协商缓存以及不缓存&#xff0c;每个缓存策略都有其适用的优化场景。 下面为大家详解何为强缓存&#xff0c;协商缓存 先说结论强缓>协商&g…

OpenCV CUDA 模块图像过滤-----创建一个计算图像导数的滤波器函数createDerivFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::createDerivFilter 是 OpenCV CUDA 模块中的一个工厂函数&#xff0c;用于创建一个计算图像导数的滤波器。这个滤波器可以用来计算图像…

AWS関連職種向け:日本語面接QA集

1. 自己紹介&#xff08;じこしょうかい&#xff09; Q&#xff1a;簡単に自己紹介をお願いします。 A&#xff1a; はい、〇〇と申します。これまで約4年間、主にAWSを基盤としたインフラ設計・構築・運用に従事してまいりました。VPCやEC2、RDS、S3などの基本サービスの設計…

(01)华为GaussDB((基于PostgreSQL))高斯数据库使用记录,dbeaver客户端配置高斯驱动,连接高斯数据库

高斯数据库是华为推出的一款基于PostgreSQL的企业级数据库产品&#xff0c;客户端使用通用的dbeaver dbeaver客户端配置高斯驱动 建议使用 dbeaver24.3.1及以上客户端&#xff0c;选择模式后执行sql会绑定模式名&#xff0c;如果使用dbeaver23.2版本&#xff0c;选择模式后执…

ARM Linux远程调试

准备 虚拟机既能ping通开发板,又能ping通外网,还要能ping通Windows主机(如果你有上位机通信(tftp、vsftp、ssh)的需求) VMware 添加网络适配器2用作桥接网卡,原有的网络适配器保持为NAT模式 打开虚拟网络编辑器,配置VMnet0为桥接模式,外部连接设置为Realtek PCIe G…

day24Node-node的Web框架Express

1. Express 基础 1.1 什么是Express node的web框架有Express 和 Koa。常用Express 。 Express 是一个基于 Node.js 的快速、极简的 Web 应用框架,用于构建 服务器端应用(如网站后端、RESTful API 等)。它是 Node.js 生态中最流行的框架之一,以轻量、灵活和易用著称。 …

让MySQL更快:EXPLAIN语句详尽解析

前言 在数据库性能调优中&#xff0c;SQL 查询的执行效率是影响系统整体性能的关键因素之一。MySQL 提供了强大的工具——EXPLAIN 语句&#xff0c;帮助开发者和数据库管理员深入分析查询的执行计划&#xff0c;从而发现潜在的性能瓶颈并进行针对性优化。 EXPLAIN 语句能够模…

[CSS3]rem移动适配

前言 什么是移动端适配? 让页面的元素在屏幕尺寸变化时, 同比放大或缩小 移动适配的方案 rem&#xff1a;目前多数企业在用的解决方案 vw/vh&#xff1a;未来的解决方案 rem 体验rem适配 目标: 能够使用rem单位设置网页元素的尺寸 网页效果: 屏幕宽度不同&#xff0c;网…

向量数据库及ChromaDB的使用

什么是向量数据库&#xff1f; 向量数据库&#xff08;Vector Database&#xff09;&#xff0c;也叫矢量数据库&#xff0c;主要用来存储和处理向量数据。 在数学中&#xff0c;向量是有大小和方向的量&#xff0c;可以使用带箭头的线段表示&#xff0c;箭头指向即为向量的方…

CodeBuddy实现pdf批量加密

本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 前言 在信息爆炸的时代&#xff0c;PDF 格式因其跨平台性和格式稳定性&#xff0c;成为办公、学术、商业等领域传递信息的重要载体。从机密合同到个人隐私文档&#xff0c…

运行打印Hello World启动了多少线程?

序言 看网上说阿里二面问到了一个看似最简单且没有标准答案的一个问题&#xff0c;所有学习编程都是从打印hello World开始的&#xff0c;那运行打印启动了多少个线程&#xff1f; 启动了多少线程&#xff1f; 在运行一个简单的 “Hello World” 程序时&#xff0c;启动的线…

java交易所,多语言,外汇,黄金,区块链,dapp类型的,支持授权,划转,挖矿(源码下载)

目前这套主要是运营交易所类型的&#xff0c;授权的会贵点&#xff0c;编译后的是可以直接跑的&#xff0c;图片也修复了&#xff0c;后门也扫了 都是在跑的项目支持测&#xff0c;全开源 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/90887047 更多…

(已开源-CVPR2024) RadarDistill---NuScenes数据集Radar检测第一名

本文介绍一篇Radar 3D目标检测模型&#xff1a;RadarDistill。雷达数据固有的噪声和稀疏性给3D目标检测带来了巨大挑战。在本文中&#xff0c;作者提出了一种新的知识蒸馏(KD)方法RadarDistill&#xff0c;它可以通过利用激光雷达数据来提高雷达数据的表征。RadarDistill利用三…

【MySQL】 数据库基础数据类型

一、数据库简介 1.什么是数据库 数据库&#xff08;Database&#xff09;是一种用于存储、管理和检索数据的系统化集合。它允许用户以结构化的方式存储大量数据&#xff0c;并通过高效的方式访问和操作这些数据。数据库通常由数据库管理系统&#xff08;DBMS&#xff09;管理&…

MongoDB 错误处理与调试完全指南:从入门到精通

在当今数据驱动的世界中&#xff0c;MongoDB 作为最流行的 NoSQL 数据库之一&#xff0c;因其灵活的数据模型和强大的扩展能力而广受开发者喜爱。然而&#xff0c;与任何复杂系统一样&#xff0c;在使用 MongoDB 过程中难免会遇到各种错误和性能问题。本文将全面介绍 MongoDB 的…

【C++】stack,queue和priority_queue(优先级队列)

文章目录 前言一、栈&#xff08;stack&#xff09;和队列&#xff08;queue&#xff09;的相关接口1.栈的相关接口2.队列的相关接口 二、栈&#xff08;stack&#xff09;和队列&#xff08;queue&#xff09;的模拟实现1.stack的模拟实现2.queue的模拟实现 三、priority_queu…

ubuntu中上传项目至GitHub仓库教程

一、到github官网注册用户 1.注册用户 地址&#xff1a;https://github.com/ 2.安装Git 打开终端&#xff0c;输入指令git,检查是否已安装Git 如果没有安装就输入指令 sudo apt-get install git 二、上传项目到github 1.创建项目仓库 进入github主页&#xff0c;点击号…