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!\n");
    }

复制代码

 

"hello qfile!\n"会被追加到文件里,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!\n";
        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!
"

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

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线程调用这些函数可能会导致用户界面冻结。

10-07
<think>根据给定的引用内容,用户希望了解QFile的介绍、用途、使用方法等信息。我们需要整合引用中的相关内容,并添加必要的解释。 引用[1]提到QFile是Qt框架的一部分,提供增强文件操作安全性的功能,如细粒度权限控制和错误处理机制。 引用[3]详细说明了QFile的构造函数,包括如何指定文件名和父对象。 引用[4]补充了文件路径获取的方法(QFileInfo相关函数)。 引用[5]展示了使用QFile和QTextStream进行文件写入的示例代码。 引用[2]是关于高通刷机工具的QFile,与Qt的QFile无关,应忽略。 回答结构: 1. 介绍QFile:Qt中用于文件操作的类,提供安全高效的文件读写功能。 2. 主要用途:读写文件、文件管理(重命名/删除/复制等)、错误处理。 3. 基本使用方法: - 创建QFile对象(指定文件名或父对象) - 打开文件(指定打开模式) - 读写操作(直接读写或结合QTextStream/QDataStream) - 关闭文件 4. 关键特性:信号与槽的错误处理、跨平台支持(Windows/Linux/macOS等)、文件路径处理辅助类(QFileInfo)。 5. 简单代码示例(参考引用[5]简化) 6. 注意事项:资源释放、错误检查、文本编码处理等。 注意:所有行内代码(如函数名)用$...$格式,独立代码块用```...```;生成相关问题。 </think>### QFile 介绍与使用指南 **QFile** 是 Qt 框架中用于文件操作的核心类(`<QFile>`),提供跨平台的文件读写、权限管理和错误处理功能。以下是详细说明: --- #### **1. 核心功能** - **安全操作**:通过信号和槽机制处理错误,减少数据损坏风险[^1]。 - **权限控制**:支持细粒度读写权限(如只读、只写、追加模式)[^1][^3]。 - **跨平台兼容**:在 Windows/Linux/macOS 等系统保持行为一致。 #### **2. 主要用途** - 读写文本/二进制文件(如配置文件、日志)。 - 文件管理(复制、重命名、删除)。 - 与流类(`QTextStream`/`QDataStream`)配合实现高效数据处理。 #### **3. 基础使用方法** ##### **(1) 创建对象** ```cpp QFile file("data.txt"); // 指定文件名 // 或指定父对象(自动内存回收) QFile *file = new QFile("data.txt", parentWidget); ``` ##### **(2) 打开文件** ```cpp // 打开模式组合(示例:只写+文本模式) if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { qDebug() << "Error: " << file.errorString(); // 输出错误信息 } ``` **常用模式**: - `QIODevice::ReadOnly`:只读 - `QIODevice::WriteOnly`:只写(覆盖原内容) - `QIODevice::Append`:追加写入 - `QIODevice::Text`:文本模式(自动处理换行符) ##### **(3) 读写操作** **写入文本**(结合 `QTextStream`): ```cpp QTextStream out(&file); out.setEncoding(QStringConverter::Utf8); // 设置UTF-8编码[^5] out << "Hello, Qt!"; // 写入字符串 ``` **读取文本**: ```cpp QTextStream in(&file); QString content = in.readAll(); // 读取全部内容 ``` ##### **(4) 关闭文件** ```cpp file.close(); // 显式关闭释放资源 ``` --- #### **4. 进阶技巧** - **路径处理**:使用 `QFileInfo` 获取规范路径[^4]: ```cpp QFileInfo info("data.txt"); QString absPath = info.absoluteFilePath(); // 绝对路径 ``` - **错误处理**:监听 `errorOccurred` 信号: ```cpp QObject::connect(&file, &QFile::errorOccurred, [](QFile::FileError error){ qDebug() << "File error: " << error; }); ``` --- #### **5. 注意事项** - **资源释放**:未指定父对象时需手动 `delete`。 - **文件锁**:避免多个进程同时写同一文件。 - **编码问题**:文本操作时显式指定编码(如 UTF-8)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值