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一次读取所有内容的代码实现如下:

Qt加载redis中的redisJson模块_读取文件

3、运行的结果如图:

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

Qt加载redis中的redisJson模块_Text_02

(2)、读取gbk格式文件时,中文字体将出现乱码,如下图:

Qt加载redis中的redisJson模块_#include_03

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

(1)、设置读取读取编码格式的类为QTextCodec,修改的代码部分如下:

Qt加载redis中的redisJson模块_读取文件_04


(2)、运行结果gbk格式文件可以正常读取,但utf-8将会出现乱码

Qt加载redis中的redisJson模块_读取文件_05


Qt加载redis中的redisJson模块_读取文件_06


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

(1)、具体代码如下

Qt加载redis中的redisJson模块_读取文件_07


(2)、读取的文件全部内容如下:

Qt加载redis中的redisJson模块_#include_08

2、只读取文件前面几行

(1)、如读取文件前 Qt加载redis中的redisJson模块_Text_09

Qt加载redis中的redisJson模块_Text_10


(2)、运行的结果如下,只显示前Qt加载redis中的redisJson模块_Text_09行:

Qt加载redis中的redisJson模块_#include_12

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行:

Qt加载redis中的redisJson模块_#include_13


三、读取文件方法总结
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();
}

Qt加载redis中的redisJson模块_Text_14

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();
}

Qt加载redis中的redisJson模块_读取文件_15

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();
}

结果如下:

Qt加载redis中的redisJson模块_#include_16


Qt加载redis中的redisJson模块_读取文件_17