zoukankan      html  css  js  c++  java
  • 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线程调用这些函数可能会导致用户界面冻结。

  • 相关阅读:
    Android 按键消息处理Android 按键消息处理
    objcopy
    SQLite多线程读写实践及常见问题总结
    android动画坐标定义
    Android动画效果translate、scale、alpha、rotate
    Android公共库(缓存 下拉ListView 下载管理Pro 静默安装 root运行 Java公共类)
    Flatten Binary Tree to Linked List
    Distinct Subsequences
    Populating Next Right Pointers in Each Node II
    Populating Next Right Pointers in Each Node
  • 原文地址:https://www.cnblogs.com/yysky/p/10558653.html
Copyright © 2011-2022 走看看