QT QFile「建议收藏」

QT QFile「建议收藏」QFile类提供了读取和写入文件的接口。QFile是一个读写文本和二进制文件和资源的I/O设备。QFile可以单独使用,或者更方便地与QTextStream或QDataStream一起使用。文件名通常在构造函数中传递,但它可以在任何时候使用setFileName()设置。无论操作系统如何,QFile都希望文件分隔符为“/”。不支持使用其他分隔符(例如’\’)。您可以使用exists()检查文件是否存在,并使用remove()删除文件。(更高级的文件系统相关操作由QFileInfo和QDir提供。

大家好,又见面了,我是你们的朋友全栈君。

QFile类提供了读取和写入文件的接口。

QFile是一个读写文本和二进制文件和资源的I/O设备。QFile可以单独使用,或者更方便地与QTextStream或QDataStream一起使用。

文件名通常在构造函数中传递,但它可以在任何时候使用setFileName()设置。无论操作系统如何,QFile都希望文件分隔符为“/”。不支持使用其他分隔符(例如’\’)。

您可以使用exists()检查文件是否存在,并使用remove()删除文件。(更高级的文件系统相关操作由QFileInfo和QDir提供。)

文件用open()打开,用close()关闭,用flush()刷新。数据通常使用QDataStream或QTextStream进行读写,但您也可以调用qiodevice继承的函数read()、readLine()、readAll()和write()。QFile还继承了getChar()、putChar()和ungetChar(),它们一次工作一个字符。

文件的大小由size()返回。您可以使用pos()获取当前的文件位置,或者使用seek()移动到一个新的文件位置。如果到达了文件的末尾,atEnd()返回true。

直接读取文件

下面的示例逐行读取文本文件:

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

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

传递给open()的QIODevice::Text标志告诉Qt将windows风格的行终止符(“\r\n”)转换为c++风格的终止符(“\n”)。默认情况下,QFile采用二进制格式,也就是说,它不会对存储在文件中的字节执行任何转换。

使用流读取文件

下一个例子使用QTextStream逐行读取文本文件:

    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负责将存储在磁盘上的8位数据转换为16位Unicode QString。默认情况下,它假定使用用户系统的本地8位编码(例如,在大多数基于unix的操作系统上,UTF-8;详见QTextCodec::codecForLocale())。这可以通过QTextStream::setCodec()来改变。

要写文本,我们可以使用operator<<(),它重载了左边的QTextStream和右边的各种数据类型(包括QString):

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

    QTextStream out(&file);
    out << "The magic number is: " << 49 << "\n";

QDataStream与此类似,可以使用操作符<<()写入数据,使用操作符>>()读取数据。详细信息请参见类文档。

当您使用QFile、QFileInfo和QDir访问使用Qt的文件系统时,您可以使用Unicode文件名。在Unix上,这些文件名被转换为8位编码。如果你想使用标准c++ api (<cstdio>或<iostream>)或特定于平台的api来访问文件而不是QFile,你可以使用encodeName()和decodeName()函数来在Unicode文件名和8位文件名之间进行转换。

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

信号

与其他QIODevice实现(如QTcpSocket)不同,QFile不发出aboutToClose()、bytesWritten()或readyRead()信号。这个实现细节意味着QFile不适合读写某些类型的文件,比如Unix平台上的设备文件。

特定于平台的问题

在Linux/Mac OS X和Windows上,文件权限的处理是不同的。在Linux下,非可写目录下无法创建文件。这在Windows上并不总是如此,例如,“My Documents”目录通常是不可写的,但仍然可以在其中创建文件。

Qt对文件权限的理解是有限的,这尤其影响QFile::setPermissions()函数。在Windows上,Qt只会设置旧的只读标志,并且只有当没有Write*标志被传递时才会设置。Qt不操作访问控制列表(acl),这使得该函数对NTFS卷几乎毫无用处。它可能仍然对使用VFAT文件系统的USB驱动器有用。POSIX acl也不被操作。

请参见QTextStream、QDataStream、QFileInfo、QDir和Qt资源系统。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/131391.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月12日 下午1:36
下一篇 2022年6月12日 下午1:46


相关推荐

  • linux安装telnet服务「建议收藏」

    linux安装telnet服务「建议收藏」文章目录前言一、telnet是什么?二、使用步骤1.安装telent2、重新启动守护进程3、测试总结前言最新公司需要迁移项目需要用到telnet命令,趁此机会做个总结归纳提示:以下是本篇文章正文内容,下面案例可供参考一、telnet是什么?telnet是一种简单的基于文本的网络协议,用于通过“TCP/IP”网络访问远程计算机和终端;telnet为用户提供了一个双向的交互式文本通信系统,该系统使用超过8字节的虚拟终端连接。二、使用步骤1.安装telent步骤如下:tep1、rpm.

    2025年7月9日
    2
  • docker(1)下载安装for mac

    docker(1)下载安装for mac前言Docker提供轻量的虚拟化,你能够从Docker获得一个额外抽象层,你能够在单台机器上运行多个Docker微容器,而每个微容器里都有一个微服务或独立应用,例如你可以将Tomcat运行在一个D

    2022年7月30日
    8
  • oracle date_trunc_oracle中truncate用法

    oracle date_trunc_oracle中truncate用法PostgreSQL与Oracle对应的函数一、对应的函数1.sysdateoraclepgsqlsysdatecurrent_date、current_timestampnvlcoalescetruncdate_trunc(text,timestamp)…文章rayner2018-01-05842浏览量Oracle日期显示问题以及trunc方法的使用我们先来假设这么一个场景,只要输入一个…

    2025年7月25日
    5
  • KVM虚拟化

    KVM虚拟化kvm 虚拟化 1 虚拟化介绍 2 kvm 介绍 3 kvm 部署 3 1kvm 安装 3 2kvmweb 管理界面安装 1 虚拟化介绍虚拟化是云计算的基础 简单的说 虚拟化使得在一台物理的服务器上可以跑多台虚拟机 虚拟机共享物理机的 CPU 内存 IO 硬件资源 但逻辑上虚拟机之间是相互隔离的 物理机我们一般称为宿主机 Host 宿主机上面的虚拟机称为客户机 Guest 那么 Host 是如

    2026年3月18日
    2
  • java人力外包的流程总结

    java人力外包的流程总结互联网高科技的快速发展加快了企业信息化进程,而很多企业在信息化进程中需要大量的软件人才,特别是java人才,存在很大的缺口,对java人才需求旺盛的企业很难招聘到合格的java人员,加上为了控制java人力成本、灵活发展公司业务,会选择和专业的it人力外包公司合作,那么java人力外包的流程是怎样的呢?一般来说,java人力外包流程分为以下几步:1、用人单位提出用人需求;2、用人单位与it人力外包公司签订技术服务框架协议;3、it人力外包公司安排候选java人员到用人单位参加面试;4、面试通

    2022年5月19日
    110
  • java之MessageDigest简单使用总结

    java之MessageDigest简单使用总结1、说明MessageDigest是Java自带的类2、简单代码比如我们需要实现md5,或者sha加密publicclassMD5AndSHA{publicfinalstaticStringMD5_SHA(Strings,Stringmethod){charhexDigits[]=

    2022年6月16日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号