引言

文件的读写是很多应用程序具有的功能,甚至某些应用程序就是围绕着某一种格式文件的处 理而开发的,所以文件读写是应用程序开发的一个基本功能。

Qt 提供了两种读写纯文本文件的基本方法:

  1. QFile 类的 IODevice 读写功能直接进行读写
  2. 利用 QFile QTextStream 结合起来,用流(Stream)的方法进行文件读写。

一、文件读操作

(1)使用QFile类

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

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

实例:点击读写文件按钮,读取文件内容到textEdit中

1️⃣设置ui界面

2️⃣在widget.cpp中编辑代码(QFileDialog类是打开文件)

   //点击选取文件按钮,弹出文件对话框
connect(ui->pushButton,&QPushButton::clicked,[=](){
QString path= QFileDialog::getOpenFileName(this,"打开文件","C:/Users/WFD/Desktop");
//将路径显示在lineEdit中
ui->lineEdit->setText(path); //读取文件内容,放入textEdit中
QFile file(path);//参数就是文件的路径
//设置打开方式
file.open(QIODevice::ReadOnly);
//用QByteArray类去接收读取的信息
QByteArray array=file.readAll();
//将读取到的数据放入textEdit中
ui->textEdit->setText(array);
//关闭文件对象
file.close();

注意:在设置打开方式的时候

QFile::open() 函数打开文件时需要传递 QIODevice::OpenModeFlag 枚举类型的参数,决定文件以什么方式打开,QIODevice::OpenModeFlag 类型的主要取值如下:

QIODevice::ReadOnly  //以只读方式打开文件,用于载入文件。
QIODevice::WriteOnly //以只写方式打开文件,用于保存文件。
QIODevice::ReadWrite //以读写方式打开。
QIODevice::Append //以添加模式打开,新写入文件的数据添加到文件尾部。
QIODevice::Truncate //以截取方式打开文件,文件原有的内容全部被删除。
QIODevice::Text //以文本方式打开文件,读取时“\n”被自动翻译为换行符,写入时字符串结束符会自动翻译为系统平台的编码,如 Windows 平台下是“\r\n”。 这些取值可以组合,例如 QIODevice::ReadOnly | QIODevice::Text 表示以只读和文本方式打开文件。

注意:在操作文件时

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

我们也可以使用readLine方法一次读取一行,然后每次对一行文字进行操作:(用file.atEnd判断是否读到最后一行)

       QByteArray array;
while(!file.atEnd())
{
array+=file.readLine();//+=叠加读过的行
}

(2)使用QTextStream类

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

    //点击选取文件按钮,弹出文件对话框
connect(ui->pushButton,&QPushButton::clicked,[=](){
QString path= QFileDialog::getOpenFileName(this,"打开文件","C:/Users/WFD/Desktop");
//将路径放在lineEdit中
ui->lineEdit->setText(path);
//读取文件内容,放入textEdit中
QFile file(path);//参数就是文件的路径
//设置打开方式
file.open(QIODevice::ReadOnly);
//用QTextStream类去读取文本信息
QTextStream QS(&file);
//用QString类去接收读取的信息
QString array=QS.readAll();
//将读取到的数据放入textEdit中
ui->textEdit->setText(array);
//关闭文件对象
file.close();

二,文件写操作

(1)使用QFile类

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

(2)使用QTextStream类

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

 三,文件信息读取

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

拓展:

  • 各编码转换
QString -> QByteArray      QString.toUtf8();

QByteArray -> std::string  QByteArray.toStdString();

std::string -> char *        string.date();
  • 常用静态函数
QFileDialog::getOpenFileName()    //获取指定文件路径名返回QString
QFileDialog::getExistingDirectory() //获取指定路径返回QString
QFileDialog::getSaveFileName() //获取指定保存路径名返回QString

QT配置ini文件的建立,读取,写入操作

1 ini文件介绍

.ini 文件是Initialization File的缩写,即初始化文件。

除了windows现在很多其他操作系统下面的应用软件也有.ini文件,用来配置应用软件以实现不同用户的要求。一般不用直接编辑这些.ini文件,应用程序的图形界面即可操作以实现相同的功能。它可以用来存放软件信息,注册表信息等。

2 ini文件格式

INI文件由节、键、值组成。

节

  [section] 

参数(键=值)

name=value

下面是一个ini文件的例子

[Section1 Name]   

KeyName1=value1   

KeyName2=value2   

...   

[Section2 Name]   

KeyName21=value21   

KeyName22=value22   

其中:[Section1 Name]用来表示一个段落。因为INI文件可能是项目中共用的,所以使用[Section Name]段名来区分不同用途的参数区。例如:[Section1 Name]表示传感器灵敏度参数区;[Section2 Name]表示测量通道参数区等等。

注解:使用分号表示(;)。在分号后面的文字,直到该行结尾都全部为注解。

3 Qt写ini文件

#include <QApplication>
#include <QSettings>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//Qt中使用QSettings类读写ini文件
//QSettings构造函数的第一个参数是ini文件的路径,第二个参数表示针对ini文件,第三个参数可以缺省
QSettings *configIniWrite = new QSettings("hahaya.ini", QSettings::IniFormat);
//向ini文件中写入内容,setValue函数的两个参数是键值对
//向ini文件的第一个节写入内容,ip节下的第一个参数
configIniWrite->setValue("/ip/first", "192.168.0.1");
//向ini文件的第一个节写入内容,ip节下的第二个参数
configIniWrite->setValue("ip/second", "127.0.0.1");
//向ini文件的第二个节写入内容,port节下的第一个参数
configIniWrite->setValue("port/open", "2222");
//写入完成后删除指针
delete configIniWrite;
return a.exec();
}

运行程序后,打开程序目录下的hahaya.ini文件,结果如下图所示:

 4 Qt读ini文件

#include <QApplication>
#include <QSettings>
#include<QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QSettings *configIniRead = new QSettings("hahaya.ini", QSettings::IniFormat);
//将读取到的ini文件保存在QString中,先取值,然后通过toString()函数转换成QString类型
QString ipResult = configIniRead->value("/ip/second").toString();
QString portResult = configIniRead->value("/port/open").toString();
//打印得到的结果
qDebug() << ipResult;
qDebug() << portResult;
//读入入完成后删除指针
delete configIniRead;
return a.exec();
}

QT从入门到入土(三)——文件的读写操作的更多相关文章

  1. QT从入门到入土(三)——信号和槽机制

    摘要 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号 (signal).这种发出是没有目的的,类似广播 ...

  2. QT从入门到入土(二)——对象模型(对象树)和窗口坐标体系

    摘要 我们使用的标准 C++,其设计的对象模型虽然已经提供了非常高效的 RTTI 支持,但是在某些方面还是不够灵活.比如在 GUI 编程方面,既需要高效的运行效率也需要强大的灵活性,诸如删除某窗口时可 ...

  3. QT从入门到入土(四)——多线程(QtConcurrent::run())

    引言 在前面对Qt多线程(QThread)做了详细的分析:QT从入门到入土(四)--多线程(QThread) - 唯有自己强大 - 博客园 (cnblogs.com) 但是最近在做项目时候,要将一个函 ...

  4. 『无为则无心』Python基础 — 41、Python中文件的读写操作(一)

    目录 1.文件操作步骤 2.文件的读写操作 (1)文件的打开 (2)打开文件模式 (3)获取一个文件对象 (4)关于文件路径 1.文件操作步骤 当我们要读取或者写入文件时,我们需要打开文件,在操作完毕 ...

  5. INI 文件的读写操作

    在C#中对INI文件进行读写操作,在此要引入using System.Runtime.InteropServices; 命名空间,具体方法如下: #region 变量 private static r ...

  6. Android 对 properties文件的读写操作

    -. 放在res中的properties文件的读取,例如对放在assets目录中的setting.properties的读取:PS:之所以这里只是有读取操作,而没有写的操作,是因为我发现不能对res下 ...

  7. C++学习48 对ASCII文件的读写操作

    如果文件的每一个字节中均以ASCII代码形式存放数据,即一个字节存放一个字符,这个文件就是ASCII文件(或称字符文件).程序可以从ASCII文件中读入若干个字符,也可以向它输出一些字符. 对ASCI ...

  8. Delphi- ini文件的读写操作

    一.读INI文件示例 procedure TForm1.FormCreate(Sender: TObject); Var MyIni :Tinifile; glAppPath :string; beg ...

  9. android报错及解决2--Sdcard进行文件的读写操作报的异常

    报错描述: 对Sdcard进行文件的读写操作的时候,报java.io.FileNotFoundException: /sdcard/testsd.txt (Permission denied),在往S ...

随机推荐

  1. PDF 文件编写器 C# 类库(版本 1.28.0)使用详解

    PDF File Writer 是一个 C# .NET 类库,允许应用程序创建 PDF 文件. PDF File Writer C# 类库使 .NET 应用程序能够生成 PDF 文档.该库使应用程序免 ...

  2. 关于Linux的一些基础命令

    今天学习scala语言,在linux系统上运行,发现对Linux的命令不太熟悉,为了熟悉掌握,也便于查询,这些命令主要是为了收藏备用,,希望能帮助到大家 linux20个常用命令是: 1.显示日期的指 ...

  3. Go语言流程控制01--选择结构之if

    package main import "fmt" /* 字符串比大小 比首字符在字符集中出现的序号,首字符相同则比较第二个字符,以此类推 go的编译器默认使用UTF8字符集 在U ...

  4. MLIR多级中间表示概述

    MLIR多级中间表示概述 MLIR项目是构建可重用和可扩展的编译器基础设施的一种新方法.MLIR旨在解决软件碎片化问题,改进异构硬件的编译,显著降低构建特定领域编译器的成本,并帮助将现有编译器连接在一 ...

  5. 【Java面试真题】剑指Offer53.2——0~n-1中缺失的数字(异或、二分两种解法)

    [Java实现]剑指Offer53.2--0~n-1中缺失的数字:面试真题,两种思路分享 前面有另一道面试题[Java实现]剑指offer53.1--在排序数组中查找数字(LeetCode34:在排序 ...

  6. Samba 服务基础

    配置SMB共享,跨平台的共享,Windows与Linux的共享 • Samba 软件项目 用途:为客户机提供共享使用的文件夹 协议:SMB(TCP 139).CIFS(TCP 445) • 所需软件包 ...

  7. RabbitMQ由浅入深入门全总结(二)

    写在最前面 距离上一次发文章已经很久了,其实这段时间一直也没有停笔,只不过在忙着找工作还有学校结课的事情,重新弄了一下博客,后面也会陆陆续续会把文章最近更新出来~ 这篇文章有点长,就分了两篇 PS:那 ...

  8. 【模拟7.27】单(liu_runda学长的神题)

    好像用到一些高中数学知识...... 满分做法: case 0:已知a数组求b数组 因为是树状结构,设当前节点x 儿子to 我们从任意一点出发可求出b[root]来,之后我们可以通过寻找两两相连节点的 ...

  9. Java程序安装失败

      检查文件路径,应该不含中文汉字,空格以及特殊字符.应将jdk的安装目录设置为纯英文路径. 是否有多个安装程序同时运行,若多点安装程序则会安装失败,打开任务管理器,查看是否有多个安装程序运行 注册表 ...

  10. Oracle几大后台进程

    pmon,smon,dbwr,lgwr,reco,ckpt.六大核心进程.无论哪个进程出现故障,都会导致数据库实例崩溃.如果杀掉某个进程,在ALERT LOG中会发现各种错误. MMAN(Memory ...