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

文件中被写入如下内容:

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[];
qint64 lineLength = file.read(buf, sizeof(buf));
if (lineLength != -)
{
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[];
qint64 lineLength = file.readLine(buf, sizeof(buf));
if (lineLength != -)
{
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线程调用这些函数可能会导致用户界面冻结。

Qt文件系统之QFile的更多相关文章

  1. qt-5.6.0 移植之qt文件系统的建立

    经过差不多两个星期的奋斗,终于在板子里面跑起来了qt 程序,虽然现在还没有把触摸屏驱动加上去,但是我相信已经不远了!!!!! 在前两篇的随笔里面 , 已经编译好了最纯净的文件系统以及交叉编译完成了qt ...

  2. 4.关于QT中的QFile文件操作,QBuffer,Label上添加QPixmap,QByteArray和QString之间的区别,QTextStream和QDataStream的区别,QT内存映射(

     新建项目13IO 13IO.pro HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += gui widgets network CON ...

  3. 4.关于QT中的QFile文件操作,QBuffer,Label上加入QPixmap,QByteArray和QString之间的差别,QTextStream和QDataStream的差别,QT内存映射(

     新建项目13IO 13IO.pro HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += gui widgets network CON ...

  4. Qt on Android 核心编程

    Qt on Android 核心编程(最好看的Qt编程书!CSDN博主foruok倾力奉献!) 安晓辉 著   ISBN 978-7-121-24457-5 2015年1月出版 定价:65.00元 4 ...

  5. Qt 文件处理(readLine可以读取char[],并且有qSetFieldWidth qSetPadChar 等全局函数)

    Qt 文件处理 Qt提供了QFile类来进行文件处理,为了更方便地处理文本文件或二进制文件,Qt还提了QTextStream类和QDataStream类,处理临时文件可以使用QTemporaryFil ...

  6. 14.QT-QFile文件,QBuffer缓冲区,QDir目录,QFileSystemWatcher文件系统监视

    QFile Qt中所有与IO相关的类都继承于QIODevice,继承图如下所示: 其中QFile类便是用于文件操作的类 在QT中,将文件当做一种特殊的外部设备对待(比如:串口,usb等就是外部设备) ...

  7. QT 文件操作

    QT提供了QFile类用于文件读写 QFile可以读写文本文件,也可以读写二进制文件 #include "widget.h" #include <QGridLayout> ...

  8. 《Qt on Android核心编程》介绍

    <Qt on Android核心编程>最终尘埃落定.付梓印刷了. 2014-11-02更新:china-pub的预售链接出来了.折扣非常低哦. 封面 看看封面的效果吧,历经几版,最终就成了 ...

  9. 嵌入式开发 迅为4418开发板Qt移植移动4G模块第一部分

    本文转自迅为论坛:http://topeetboard.com 了解更多:https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-7744162139 ...

随机推荐

  1. 关闭Azure虚拟机

    Press the Windows key, and then in the Start page, located at the bottom-left, click the Power butto ...

  2. Unity3D实现多语言切换

    项目现在需要做多语言切换部分,下面是一个基本多语言切换实现 1. 首先建立一个类来存放字符,其中包括一个静态方法来根据Key和语言类型获取对应字符 using System.Collections; ...

  3. 同步I/O、异步I/O与阻塞I/O、非阻塞I/O的区别

    一.I/O I/O (Input/Output,输入/输出)即数据的读取(接收)或写入(发送)操作. 通常用户进程中的一个完整I/O分为两阶段:用户进程空间<-->内核空间.内核空间< ...

  4. Go小爬虫测试

    package main import ( "fmt" "io/ioutil" "log" "net/http" ) t ...

  5. 实验三 CC2530平台上CC2530平台上定时器组件的

    实验三 CC2530平台上CC2530平台上定时器组件的TinyOS编程 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生初步掌握CC2530定时器的PWM功能,及其TinyOS ...

  6. SQL语句删除和添加外键、主键的方法

    --删除外键 语法:alter table 表名 drop constraint 外键约束名 如: alter table Stu_PkFk_Sc drop constraint FK_s alter ...

  7. 作业一 :关于C语言

    C语言是计算机专业的基础课,同时也是计算机专业的第一个入门语言,学好C语言母庸质疑.就目前来看,在C语言中已经学习的内容有:基本运算符及表达式.输入输出函数.选择 结构程序设计.循环结构程序设计.数组 ...

  8. EasyUI学习(一)——EasyUI入门

    EasyUI学习总结(一)——EasyUI入门 一.EasyUI下载 EasyUI官方下载地址:http://www.jeasyui.com/download/index.php,目前最新的版本是:j ...

  9. 转:Excel—“撤销工作表保护密码”的破解并获取原始密码

    在日常工作中,您是否遇到过这样的情况:您用Excel编制的报表.表格.程序等,在单元格中设置了公式.函数等,为了防止其他人修改您的设置或者防止您自己无意中修改,您可能会使用Excel的工作表保护功能, ...

  10. #Windows# Excel无法打开右键新建的spreasheet

    此问题由来已久. 原因是之前安装过wps,并且现在卸载了. 因此.xls与.xlsx这两个文件格式的新建模板的路径被改成了纸箱WPS Office模板的路径,从而导致无法Excel打开这个文件时报错 ...