• QT QFile


    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。

    直接读取文件

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

    1. QFile file("in.txt");
    2. if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    3. return;
    4. while (!file.atEnd()) {
    5. QByteArray line = file.readLine();
    6. process_line(line);
    7. }

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

    使用流读取文件

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

    1. QFile file("in.txt");
    2. if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    3. return;
    4. QTextStream in(&file);
    5. while (!in.atEnd()) {
    6. QString line = in.readLine();
    7. process_line(line);
    8. }

    本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

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

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

    1. QFile file("out.txt");
    2. if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
    3. return;
    4. QTextStream out(&file);
    5. out << "The magic number is: " << 49 << "\n";

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

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

    在Unix上,有一些特殊的系统文件(例如在/proc中),size()总是返回0,但是你仍然可以从这样的文件中读取更多的数据;生成数据是对调用read()的直接响应。然而,在这种情况下,您不能使用atEnd()来确定是否有更多的数据需要读取(因为atEnd()对于声明大小为0的文件将返回true)。相反,您应该调用readAll(),或反复调用read()或readLine(),直到无法读取更多的数据。下一个例子使用QTextStream逐行读取/proc/modules:

    1. QFile file("/proc/modules");
    2. if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    3. return;
    4. QTextStream in(&file);
    5. QString line = in.readLine();
    6. while (!line.isNull()) {
    7. process_line(line);
    8. line = in.readLine();
    9. }

    信号

    与其他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资源系统。

    本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

  • 相关阅读:
    灵性图书馆:好书推荐-《终极真理》
    react-native中ScrollView套ScrollView
    Java面试题200+大全(合适各级Java人员)
    南卡A2降噪耳机和vivo TWS2蓝牙耳机哪个好?vivo TWS2和南卡降噪蓝牙耳机测评
    Netty学习笔记
    深入理解Kafka核心设计与实战原理 笔记
    2022谷粒商城学习笔记(二)人人开源逆向工程
    dubbo(3): 启动时检查/超时/重试/幂等
    [附源码]Python计算机毕业设计二手图书回收销售网站
    Paddle Serving v0.9.0 重磅发布多机多卡分布式推理框架
  • 原文地址:https://blog.csdn.net/m0_60259116/article/details/128163095