Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7688355
  • 博文数量: 961
  • 博客积分: 15795
  • 博客等级: 上将
  • 技术积分: 16612
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 14:23
文章分类

全部博文(961)

文章存档

2016年(1)

2015年(61)

2014年(41)

2013年(51)

2012年(235)

2011年(391)

2010年(181)

分类: 嵌入式

2013-12-20 10:51:58

文件操作是应用程序必不可少的部分。Qt 作为一个通用开发库,提供了跨平台的文件操作能力。

 Qt5 新增加了一个QFileDevice类。途中所涉及的类及其用途简要说明如下:

· QFlie:访问本地文件或者嵌入资源;

· QTemporaryFile:创建和访问本地文件系统的临时文件;

· QBuffer:读写QByteArray

· QProcess:运行外部程序,处理进程间通讯;

· QTcpSocketTCP协议网络数据传输;

· QUdpSocket:传输 UDP 报文;

· QSslSocket:使用 SSL/TLS 传输数据;

· QFileDeviceQt5新增加的类,提供了有关文件操作的通用实现。

这其中,QProcessQTcpSocketQUdpSoctetQSslSocket是顺序访问设备。所谓“顺序访问”,是指它们的数据只能访问一遍:从头走到尾,从第一个字节开始访问,直到最后一个字节,中途不能返回去读取上一个字节;QFileQTemporaryFileQBuffer是随机访问设备,可以访问任意位置任意次数,还可以使用QIODevice::seek()函数来重新定位文件访问位置指针。

QFile主要提供了有关文件的各种操作,比如打开文件、关闭文件、刷新文件等。我们可以使用QDataStreamQTextStream类来读写文件,也可以使用QIODevice提供的read()readLine()readAll()以及write()这样的函数。值得注意的是,有关文件本身的信息,比如文件名、文件所在目录的名字等,则是通过QFileInfo获取,而不是自己分析文件路径字符串。

下面我们使用一段代码来看看QFile的有关操作:



点击(此处)折叠或打开

  1. int main(int argc, char *argv[])
  2. {
  3.     QApplication app(argc, argv);
  4.  
  5.     QFile file("in.txt");
  6.     if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
  7.         qDebug() << "Open file failed.";
  8.         return -1;
  9.     } else {
  10.         while (!file.atEnd()) {
  11.             qDebug() << file.readLine();
  12.         }
  13.     }
  14.  
  15.     QFileInfo info(file);
  16.     qDebug() << info.isDir();
  17.     qDebug() << info.isExecutable();
  18.     qDebug() << info.baseName();
  19.     qDebug() << info.completeBaseName();
  20.     qDebug() << info.suffix();
  21.     qDebug() << info.completeSuffix();
  22.  
  23.     return app.exec();
  24. }

 


二进制文件读写

Qt 还供了更高一级的操作:用于二进制的流QDataStream和用于文本流的QTextStream

 QDataStream既能够存取 C++ 基本类型,如 intcharshort 等,也可以存取复杂的数据类型,例如自定义的类。QDataStream可以很方便地对文件、网络套接字等进行读写操作。我们从代码开始看起:我们从代码开始看起:


点击(此处)折叠或打开

  1. QFile file("file.dat");
  2. file.open(QIODevice::WriteOnly);
  3. QDataStream out(&file);
  4. out << QString("the answer is");
  5. out << (qint32)42;
  6. file.close();// 如果不想关闭文件,可以使用 file.flush();

 下面,我们要将这个数据读取出来:

点击(此处)折叠或打开

  1. file.open(QIODevice::ReadOnly);
  2. QDataStream in(&file);
  3. QString str;
  4. qint32 a;
  5. in >> str >> a;

这段代码没什么好说的。唯一需要注意的是,你必须按照写入的顺序,将数据读取出来。



 文本文件读写

 QTextStream和QDataStream的使用类似,只不过它是操作纯文本文件的。

 

例如下面的代码将把“The answer is 42”写入到 file.txt 文件中:

点击(此处)折叠或打开

  1. QFile data("file.txt");
  2. if (data.open(QFile::WriteOnly | QIODevice::Truncate)) {
  3.     QTextStream out(&data);
  4.     out << "The answer is " << 42;
  5. }

这里,我们在open()函数中增加了QIODevice::Truncate打开方式。我们可以从下表中看到这些打开方式的区别:

枚举值

描述

QIODevice::NotOpen

未打开

QIODevice::ReadOnly

以只读方式打开

QIODevice::WriteOnly

以只写方式打开

QIODevice::ReadWrite

以读写方式打开

QIODevice::Append

以追加的方式打开,新增加的内容将被追加到文件末尾

QIODevice::Truncate

以重写的方式打开,在写入新的数据时会将游标设置在文件开头

QIODevice::Text

在读取时,将行结束符转换成 \n;在写入时,将行结束符转换成本地格式,例如 Win32 平台上是 \r\n

QIODevice::Unbuffered

忽略缓存



虽然QTextStream的写入内容与QDataStream一致,但是读取时却会有些困难:

点击(此处)折叠或打开

  1. QFile data("file.txt");
  2. if (data.open(QFile::ReadOnly)) {
  3.     QTextStream in(&data);
  4.     QString str;
  5.     int ans = 0;
  6.     in >> str >> ans;
  7. }

在使用QDataStream的时候,这样的代码很方便,但是使用了QTextStream时却有所不同:读出的时候,str 里面将是 The answer is 42ans 是 0。这是因为以文本形式写入数据,是没有数据之间的分隔的。

 

默认情况下,QTextStream的编码格式是 Unicode,如果我们需要使用另外的编码,可以使用
stream.setCodec("UTF-8");
 
返回目录:Qt学习整理


阅读(13786) | 评论(0) | 转发(2) |
0

上一篇:QPainterPath绘图路径

下一篇:Qt 存储容器

给主人留下些什么吧!~~