• Qt文件系统之QFile


    QFile文件操作

    文件打开方式:

    QIODevice::NotOpen    0x0000   设备不打开.
    QIODevice::ReadOnly    0x0001  
    设备 以只读的方式打开.
    QIODevice::WriteOnly    0x0002  
    设备 以只写的方式打开.
    QIODevice::ReadWrite    ReadOnly | WriteOnly   
    设备以读写的方式打开,写入文件会覆盖之前的内容(打开文件期间多次写入不会覆盖).
    QIODevice::Append    0x0004   
    设备以追加模式打开,以便将所有数据写入文件末尾,此模式下不能读文件.
    QIODevice::Truncate    0x0008  
    如果可能,设备在打开之前会被截断。 设备的所有早期内容都将丢失。
    QIODevice::Text    0x0010   
    读取时,行尾终止符被转换为' n'。 写入时,行尾终止符将转换为本地编码,例如Win32的“ r n”。
    QIODevice::Unbuffered    0x0020   
    绕过设备中的任何缓冲区。

    注意:

    普通写入会覆盖之前文件的内容部分或者全部,取决于写入内容的大小。

    当同时使用Append方式和其它读文件方式打开文件时,读文件无效。

    例如如下代码:

    QFile file("/home/cheng/TestPro/D_FileOperation/File/test.txt");
        if(file.open( QIODevice::ReadWrite | QIODevice::Append ) )// QIODevice::Text |
        {
            QByteArray arr;
            arr =  file.read(6);
            qDebug() << arr;
            file.write("hello qfile!
    ");
        }
    "hello qfile!
    "会被追加到文件里,arr输出为空。

    QByteArray类

    QByteArray类提供了一个字节数组。

    QByteArray可用于存储原始字节(包括' 0')和传统的8位' 0'终止字符串。使用QByteArray比使用const char *更方便。在幕后,它始终确保数据后跟' 0'终止符,并使用隐式共享(写时复制)来减少内存使用并避免不必要的数据复制。

    写文件

    qint64 QIODevice::write ( const char * data, qint64 maxSize )  //将最多maxSize字节的数据从数据写入设备。 返回实际写入的字节数,如果发生错误,则返回-1。
    qint64 QIODevice::write ( const char * data )  //将数据从零字节的8位字符串写入设备。 返回实际写入的字节数,如果发生错误,则返回-1。
    qint64 QIODevice::write ( const QByteArray & byteArray )  //将byteArray的内容写入设备。 返回实际写入的字节数,如果发生错误,则返回-1。
    QFile file("/home/cheng/TestPro/D_FileOperation/File/test.txt");
        if(file.open( QIODevice::WriteOnly ))
        {
            const char* data = "hello qfile!
    ";
            QByteArray arr(data);
            file.write(data);
            file.write(arr);
            file.write(data,5);
        }

    文件中被写入如下内容:

    hello qfile!
    hello qfile!
    hello

    读文件

    read()函数

    qint64 QIODevice::read ( char * data, qint64 maxSize )//

    从设备读取最多maxSize字节为数据,并返回读取的字节数。 如果发生错误,例如尝试从以WriteOnly模式打开的设备读取时,此函数返回-1。当没有更多数据可供读取时,返回0。在关闭的套接字上读取或在进程死亡后读取也会返回-1


    QByteArray QIODevice::read ( qint64 maxSize )  //从设备读取最多maxSize字节,并返回读取为QByteArray的数据。
    此功能无法报告错误; 返回一个空的QByteArray()可能意味着当前没有数据可用于读取,或者发生了错误。
    QFile file("/home/cheng/TestPro/D_FileOperation/File/test.txt");
        if (file.open(QFile::ReadOnly))
        {
         //QByteArray arr = file.read(1024);
             //qDebug() << arr;
             char buf[1024];
             qint64 lineLength = file.read(buf, sizeof(buf));
             if (lineLength != -1)
             {
                 QString str(buf);//将字符数组转换为QString
                 qDebug() << str;
             }
         }

    打印结果:

    "hello qfile!
    hello qfile!
    hello"

    readAll()函数

    QByteArray QIODevice::readAll ()

    从设备读取所有可用数据,并将其作为QByteArray返回。
    此功能无法报告错误; 返回一个空的QByteArray()可能意味着当前没有数据可用于读取,或者发生了错误。

    QFile file("/home/cheng/TestPro/D_FileOperation/File/test.txt");
        if (file.open(QFile::ReadOnly))
        {
             QByteArray arr = file.readAll();
             qDebug() << arr;
    
         }

    打印结果:

    "hello qfile!
    hello qfile!
    hello"

    readData()函数

    qint64 QIODevice::readData ( char * data, qint64 maxSize ) [pure virtual protected]

    将从设备读取的maxSize字节读取到数据中,并返回读取的字节数,发生错误时返回-1。 如果没有要读取的字节,如果永远不会有更多可用字节,则此函数应返回-1(例如:socket closed,pipe closed,sub-process finished)。
    该功能由QIODevice调用。 在创建QIODevice的子类时重新实现此功能。

    readLine()函数

    qint64 QIODevice::readLine ( char * data, qint64 maxSize )

    此函数从设备读取一行ASCII字符,最大为(maxSize - 1)个字节,将字符存储在数据中,并返回读取的字节数。 如果无法读取行但没有出现错误,则此函数返回0.如果发生错误,则此函数返回可读取的长度,如果未读取任何内容,则返回-1。
    终止' 0'字节始终附加到数据,因此maxSize必须大于1。
    读取数据,直到满足以下任一条件:
    读取第一个' n'字符。
    maxSize - 读取1个字节。
    检测到设备数据的结束。

    此函数调用readLineData(),readLineData()是使用对getChar()的重复调用实现的。 您可以通过在自己的子类中重新实现readLineData()来提供更高效的实现。

    QFile file("/home/cheng/TestPro/D_FileOperation/File/test.txt");
        if (file.open(QFile::ReadOnly))
        {
            char buf[1024];
            qint64 lineLength = file.readLine(buf, sizeof(buf));
            if (lineLength != -1)
            {
                QString str(buf);
                qDebug() << str;
            }
        }

    打印结果:

    "hello qfile!
    "

    可以看出" "也被附加到了数据里。

    getChar()函数

    bool QIODevice::getChar ( char * c )

    从设备中读取一个字符并将其存储在c中。 如果c为0,则丢弃该字符。 成功时返回true; 否则返回false。


    QIODevice类

    QIODevice类是Qt中所有I / O设备的基本接口类。

    QIODevice为支持读取和写入数据块的设备提供了通用实现和抽象接口,例如QFile,QBuffer和QTcpSocket。 QIODevice是抽象的,无法实例化,但通常使用它定义的接口来提供与设备无关的I / O功能。 例如,Qt的XML类在QIODevice指针上运行,允许它们与各种设备(例如文件和缓冲区)一起使用。
    在访问设备之前,必须调用open()来设置正确的OpenMode(例如ReadOnly或ReadWrite)。 然后,您可以使用write()或putChar()写入设备,并通过调用read(),readLine()或readAll()来读取。 完成设备后,请调用close()。

    QIODevice区分两种类型的设备:随机访问设备和顺序设备。

    随机访问设备支持使用seek()寻找任意位置。通过调用pos()可以获得文件中的当前位置。 QFileQBuffer是随机访问设备的示例。
    顺序设备不支持寻找任意位置。必须一次读取数据。函数pos()和size()不适用于顺序设备。 QTcpSocketQProcess是顺序设备的

    QIODevice的某些子类(例如QTcpSocketQProcess)是异步的。这意味着诸如write()或read()之类的I / O函数总是立即返回,而当控制返回到事件循环时,可能会发生与设备本身的通信。 QIODevice提供的功能允许您强制立即执行这些操作,同时阻止调用线程并且不进入事件循环。这允许在没有事件循环的情况下使用QIODevice子类,或者在单独的线程中使用:
    waitForReadyRead() - 此函数暂停调用线程中的操作,直到有新数据可供读取。
    waitForBytesWritten() - 此函数暂停调用线程中的操作,直到已将一个数据有效负载写入设备。
    waitFor ....() - QIODevice的子类为特定于设备的操作实现阻塞功能。例如,QProcess有一个名为waitForStarted()的函数,它暂停调用线程中的操作,直到进程启动。
    从主GUI线程调用这些函数可能会导致用户界面冻结。

  • 相关阅读:
    JVM垃圾收集器-Parallel Scavenge收集器
    JVM垃圾收集器-ParNew收集器
    JVM垃圾收集器-Serial收集器
    UCloud数据盘扩容步骤
    java中强引用、软引用、弱引用、幻象引用有什么区别?分别使用在什么场景?
    java中exception和error有什么区别,运行时异常和一般异常有什么区别
    maven中的坐标和仓库
    Maven常用的构建命令
    Maven学习
    【设计原则和编程技巧】单一职责原则 (Single Responsibility Principle, SRP)
  • 原文地址:https://www.cnblogs.com/yysky/p/10558653.html
Copyright © 2020-2023  润新知