QT使用QFile进行文件操作

QFile类我我们提供了操作文件的常用功能。它是一种io设备,可以用来读写文本文件和二进制文件,也可以用来读写Qt的资源文件。QFile类可以单独使用,该类本身提供了read/write函数,但更方便的方式是,将QFile和QTextStream或QDataStream一起使用。

一般情况下,使用QFile创建对象时,就会把要操作的文件名传递给它。但该类也提供了一个setFileName() 方法,允许我们在任何时候为QFile对象设置要操作的文件名。但是,QFile 只支持"/",不支持"\"。

在构造QFile的对象后,我们可以使用exists() 判断文件是否存在,使用remove() 删除一个文件。在进行实际的内容读写前,需调用open()打开文件,读写结束后,要调用close()关闭文件,也可以写调用一下flush(),冲刷缓冲区。就向我们刚才说的,我们一般使用QDataStream或QTextStream 读写文件,但我们也可以使用QFile继承自QIODevice的函数,如read()、readLine()、readAll()、write()等。除了读写函数外,我们还能使用size() 函数获得文件的大小;使用pos() 或 seek() 函数获取及设置文件读写的位置;使用atEnd() 函数判断是否到达了文件结尾。

直接使用QFile读写文件

      QFile file("in.txt");
      if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
          return;

      while (!file.atEnd()) {
          QByteArray line = file.readLine();
          process_line(line);
      }

在此,我们将QIODevice::Text传给了open()函数,该标志是用来告诉Qt将文件中的换行符由"\r\n",转换成"\n"。因为,默认情况下,QFile把文件当做二进制进行读写,不会进行任何的字节转换。

使用流读取文件:

      QFile file("in.txt");
      if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
          return;

      QTextStream in(&file);
      while (!in.atEnd()) {
          QString line = in.readLine();
          process_line(line);
      }

QTextStream会把存储在磁盘上的8bit数据转换为16bit的Unicode 字符串QString。默认情况下,QTextStream假定文件使用的是用户系统的本地8bit编码。我们也可以使用QTextStream::setCodec() 函数还改变这种行为。
当使用QFile,QFileInfo和QDir类去操作文件系统时,你可以使用Unicode编码的文件名。在Unix平台上,这些文件名会被转换成8-bit编码。但如果你想使用标准c++ API或者平台特定的API去访问文件,那么你可以使用encodeName() 和 decodeName() 函数在Unicode文件名和8-bit文件名之间进行转换。

在Unix平台下,存在一些特殊的系统文件,例如/proc目录下,对这个文件调用size() 总是返回0,然而,你还是能够从此类文件中读取到数据;这些数据是为了相应你的read() 函数而间接产生出来的。但是,在这种情况下,你不能使用atEnd() 来判断是否还有数据可读(因为atEnd() 对于大小为0的文件返回true)。相反,你应该调用readAll(),或 反复调用read()、readLine()知道没有数据可读为止。如下代码所示,我们使用QTextStream一行一行的读取/proc/modules文件:

      QFile file("/proc/modules");
      if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
          return;

      QTextStream in(&file);
      QString line = in.readLine();
      while (!line.isNull()) {
          process_line(line);
          line = in.readLine();
      }

其实,除了上面使用的QFile从QIODevice继承的open() 函数外,QFile本身也为我们提供了两个open() 函数:

bool open(FILE *fh, OpenMode mode, FileHandleFlags handleFlags = DontCloseHandle)
bool open(int fd, OpenMode mode, FileHandleFlags handleFlags = DontCloseHandle)

第一个open() 会按一定的模式打开一个现存的文件指针。同时,可以再指定额外的标志。如下代码所示:

  #include <stdio.h>

  void printError(const char* msg)
  {
      QFile file;
      file.open(stderr, QIODevice::WriteOnly);
      file.write(msg, qstrlen(msg));        // write to stderr
      file.close();
  }

当一个QFile已这种方式打开时,那么后续的close() 函数的作用会受到AutoCloseHandle标志的影响。如果指定了该标志,并且这个open() 函数调用成功了,那么后续再QFile对象上调用close() 会关闭底层文件句柄。否则,若没指定这个标志,close()函数不会真正的关闭底层文件句柄,而只是冲刷 了一下缓冲区。如下测试代码所示:

#include <QCoreApplication>
#include <QFile>
#include <cstdio>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    FILE *pf = fopen("test.txt", "wb");
    if(pf == nullptr)
        return 0;
    QFile file;
    file.open(pf, QIODevice::WriteOnly); //1
    //file.open(pf, QIODevice::WriteOnly, QFileDevice::AutoCloseHandle); //2
    file.write("hello");
    file.close();
    fwrite("world", strlen("world"), 1, pf);

    return a.exec();
}

当我们使用 1处的方式打开文件指针,即不指定AutoCloseHandle标志,则close() 函数后的“world”是可以继续被写入文件的;若使用2处的方式打开文件指针,则“world”并不会再被写入文件,因为底层文件已关闭。

第二个open() 函数与此类似,只不过其是按一定模式打开一个现存的文件描述符。AutoCloseHandle标志也会影响后续的close()函数。同时,如果QFile已这种方式打开,那么它会被自动地设置为raw mode,这意味着文件的输入、输出函数的执行会变慢。如果你遇到了性能问题,你应该尝试使用其他的打开函数。

至于其他的成员函数,比如文件的删除、重命名,文件访问权限的设置,Qt的帮助文档已讲的很清除,大家可以在使用时随时查看即可。

到此这篇关于QT使用QFile进行文件操作的文章就介绍到这了,更多相关QT QFile文件操作内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Qt基础开发之Qt文件操作类QFile读写文件的详细方法与实例及QDataStream的使用方法

    Qt文件操作类QFile简介 Qt中使用QFile类来操作文件的输入/输出.继承至QIODevice,QIODevice类是输入/输出设备的基类, 为设备提供了公共实现和抽象接口用于读写块数据.QIODevice又继承至QObject. 1.使用QFile类打开文件 QFile的构造函数 QFile(const QString &name) //传入一个文件路径 构造完成后,并没有打开文件,需要使用QFile::open函数来打开文件 [virtual] bool QFile::open(Ope

  • Qt QFile文件操作的具体使用

    目录 QFile文件操作 QFile+QTextStream QFile+QDataStream 很多应用程序都需要具备操作文件的能力,包括对文件内容进行读/写.创建和删除文件等,甚至某些应用程序的诞生纯粹是为了操作文件,比如 WPS Office.PDFedit 等.为此,Qt 框架提供了 QFile 类专门用来操作文件. QFile文件操作 QFile 类支持对文件进行读取.写入.删除.重命名.拷贝等操作,它既可以操作文件文件,也可以操作二进制文件. 使用 QFile 类操作文件之前,程序中

  • QT使用QFile进行文件操作

    QFile类我我们提供了操作文件的常用功能.它是一种io设备,可以用来读写文本文件和二进制文件,也可以用来读写Qt的资源文件.QFile类可以单独使用,该类本身提供了read/write函数,但更方便的方式是,将QFile和QTextStream或QDataStream一起使用. 一般情况下,使用QFile创建对象时,就会把要操作的文件名传递给它.但该类也提供了一个setFileName() 方法,允许我们在任何时候为QFile对象设置要操作的文件名.但是,QFile 只支持"/",不

  • C/C++ QT实现解析JSON文件的示例代码

    JSON是一种轻量级的数据交换格式,它是基于ECMAScript的一个子集,使用完全独立于编程语言的文本格式来存储和表示数据,简洁清晰的的层次结构使得JSON成为理想的数据交换语言,Qt库为JSON的相关操作提供了完整的类支持. 创建一个解析文件,命名为config.json我们将通过代码依次解析这个JSON文件中的每一个参数,具体解析代码如下: { "blog": "https://www.cnblogs.com/lyshark", "enable&qu

  • C++、Qt分别读写xml文件的方法实例

    目录 XML语法 C++使用tinyxml读写xml Qt读写xml 总结 XML语法 第一行是XML文档声明,<>内的代表是元素,基本语法如以下所示.C++常见的是使用tiny库读写,Qt使用自带的库读写: <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <根元素> <元素 属性名="属性值" 属性名="属性

  • QT基于TCP实现文件传输系统

    本文实例为大家分享了QT基于TCP实现文件传输系统的具体代码,供大家参考,具体内容如下 一.设计目标 1.发送端选择要传输的文件,进度条显示传输的进度,手动输入要传输的ip地址和端口号 2.接收到数据后显示接收进度,接收完毕后进度条自动消失 二.效果展示 三.实现过程 Qt文件传输发送端 1. 连接服务器 2. 当连接成功后会发送connected信号 3. 在槽函数中发送文件头信息 4. 当数据发送成功后会发送bytesWritten 5. 在槽函数中发送文件内容 UI布局 filesend.

  • ASP.NET Core 2.0 本地文件操作问题及解决方案

    问题 如何在ASP.NET Core 2.0中受限地访问本地目录和文件信息? 答案 新建一个空项目,修改Startup类,添加访问本地文件所需的服务: public void ConfigureServices(IServiceCollection services) { services.AddSingleton<IFileProvider>( new PhysicalFileProvider(Directory.GetCurrentDirectory())); } 创建一个中间件,读取根目

  • python 文件操作删除某行的实例

    使用continue跳过本次写循环就可以了 #文本内容 Yesterday when I was young 昨日当我年少轻狂 The tasting of life was sweet 生命的滋味是甜的 As rain upon my tongue tasting I lived by night and shunned the naked light of day tasting123 And only now I see how the time ran away tasting tast

  • Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)

    复制代码 代码如下: using System; using System.IO; using System.Text; using System.Data; using System.Web.UI; using System.Web.UI.WebControls; namespace ec { /// <summary> /// 文件操作类 /// </summary> public class FileObj : IDisposable { private bool _alre

  • nodejs文件操作模块FS(File System)常用函数简明总结

    件系统操作相关的函数挺多的.首先可以分为两大类. 一类是异步+回调的. 一类是同步的. 在这里只对异步的进行整理,同步的只需要在函数名称后面加上Sync即可 1. 首先是一类最常规的读写函数,函数名称和形式,应该是起源于C语言的. 复制代码 代码如下: fs.open(文件路径,读写标识,[文件mode值,666],回调函数(err,文件句柄fd));          fs.read(文件句柄fd,被写入的buffer,offset,length,position,回调函数(err, byte

随机推荐