【1】QT文件操作

今天是作息表开始的第一天,凡是都得有个好的开始,如同所期望的一样,今天规矩的按照作息表执行了一番,感觉还不错,如同表上的安排写下这篇文章来做一下学习的总结。

3956112-5df139cb729d5902.png

1.参考资料

豆子博主QT学习之路2系列教程
书籍《Qt Quick 核心编程》
Qt参考手册

2.学习内容

文件操作
#include <QCoreApplication>
#include <QIODevice>
#include <QFile>
#include <QFileInfo>
#include <QDebug>
#include <QDir>
#include <QTextCodec>
#include <QString>

int main(int argc, char *argv[])
{
 QCoreApplication a(argc, argv);

 qDebug()<<QDir::currentPath();//获取程序路径

 QFile file("test.txt");
 if(!file.open(QIODevice::ReadOnly|QIODevice::Text)){
 qDebug()<<"open file failed";
 return -1;
 }else{
 //设置字符集
 QTextCodec *codec=QTextCodec::codecForName("utf-8");
 while(!file.atEnd()){

// qDebug()<<file.readLine();
// qDebug()<<file.readLine().toStdString().c_str();
 //逐行读取数据
 QByteArray line=file.readLine();

 //数据转换为unicode
 QString str=codec->toUnicode(line);
 qDebug()<<str;
 }
 }

 QFileInfo info(file);
 qDebug()<<info.isDir();//是否为文件夹
 qDebug()<<info.isExecutable();//是否为可执行文件
 qDebug()<<info.baseName();//文件名
 qDebug()<<info.completeBaseName();
 qDebug()<<info.suffix();//后缀名
 qDebug()<<info.completeSuffix();

 return a.exec();
}

备注:中文输出出现乱码,设置字符集可以解决,代码中已经给出。

二进制文件读写
#include <QCoreApplication>
#include <QFile>
#include <QIODevice>
#include <QDataStream>
#include <QDebug>

int writefile()
{
 //写入文件
 QFile file("file.dat");
 file.open(QIODevice::WriteOnly);
 QDataStream out(&file);

 //写入魔术数字和版本
 out<<(qint32)0xA0B0C0D0;
 out<<(qint32)123;

 out.setVersion(QDataStream::Qt_4_0);

 //写入数据
 out<<"lots_of_interesting_data";

 file.flush();

 return 1;
}

int readfile()
{
 QFile file("file.dat");
 file.open(QIODevice::ReadOnly);
 QDataStream in(&file);

 //检查魔术数字
 quint32 magic;
 in>>magic;
 if(magic!=0xA0B0C0D0){
 return 0;
 }

 //检查版本
 qint32 version;
 in>>version;
 if(version<100){
 return 0;
 }
 if(version>123){
 return 0;
 }
 if(version<=110){
 in.setVersion(QDataStream::Qt_3_3);
 }else{
 in.setVersion(QDataStream::Qt_4_0);
 }
 //读取数据

 QByteArray s;
 if(version>=120){
 in>>s;
 }

 file.close();
 qDebug()<<s;

 return 1;
}

//读写数据
int readwritefile()
{
 QFile file("file.bat");
 file.open(QIODevice::ReadWrite);

 QDataStream stream(&file);
 QString str="the answer is 42";
 QString strout;

 stream<<str;
 stream.device()->seek(0);
 stream>>strout;

 qDebug()<<strout;
 return 1;
}

int main(int argc, char *argv[])
{
 QCoreApplication a(argc, argv);

 if(writefile()){
 qDebug()<<"writesuccess";
 }
 if(readfile()){
 qDebug()<<"readsuccess";
 }
 if(readwritefile()){
 qDebug()<<"rwsuccess";
 }
 return a.exec();
}

备注:数据写入不成功在写入文件操作之后,关闭文件或者调用

file.flush();
文本文件读取
#include <QCoreApplication>
#include <QFile>
#include <QTextStream>
#include <QDebug>

int main(int argc, char *argv[])
{
 QCoreApplication a(argc, argv);

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

 QFile file("file.txt");
 if(file.open(QFile::ReadOnly)){
 QTextStream in(&file);
 QString str;
 str=in.readLine();
 qDebug()<<str;
 }

 return a.exec();
}
存储容器遍历
#include <QCoreApplication>
#include <QList>
#include <QString>
#include <QDebug>
#include <QMutableListIterator>
#include <iterator>
#include <QMapIterator>
#include <QHashIterator>
#include <QMap>
#include <QLinkedList>

int main(int argc, char *argv[])
{
 QCoreApplication a(argc, argv);

 //java风格的遍历器
 {
 //QListIterator是只读遍历器
 QList<QString>list;
 list<<"A"<<"B"<<"C"<<"D";
 QListIterator<QString> i(list);
 while(i.hasNext()){
 qDebug()<<i.next();
 }

 //QMutableListIterator读写遍历器
 QList<int>intlist;
 intlist<<1<<2<<3<<4<<5;
 QMutableListIterator<int> j(intlist);
 while(j.hasNext()){
 if(j.next()%2!=0){
 j.remove();
 }
 }

 //输出改后的数据
 QListIterator<int> l(intlist);
 while(l.hasNext()){
 qDebug()<<l.next();
 }

 QMap<int, QString> map;
 map.insert(1,"A");
 map.insert(2,"B");
 map.insert(3,"C");

 QMapIterator<int, QString> i2(map);
 while (i2.hasNext()) {
 qDebug() << i2.next().value();
 }
 }

 //stl风格的遍历器
 {
 QList<QString>strlist;
 strlist<<"A"<<"B"<<"C"<<"D";

 QList<QString>::iterator i1;
 for(i1=strlist.begin();i1!=strlist.end();++i1){
 *i1=(*i1).toLower();
 }

 //const_iterator进行只读访问
 QList<QString>::const_iterator j1;
 for(j1=strlist.constBegin();j1!=strlist.constEnd();++j1){
 qDebug()<<*j1;
 }

 QMap<int, int> map1;
 map1.insert(1,1);
 map1.insert(2,2);
 map1.insert(3,3);

 QMap<int, int>::const_iterator l1;
 for (l1 = map1.constBegin(); l1!= map1.constEnd(); ++l1) {
 qDebug() << l1.key() << ":" << l1.value();
 }
 }

 //foreach遍历
 QLinkedList<QString> list;
 list<<"a"<<"b"<<"c";
 QString str;
 foreach(str,list){
 qDebug()<<str;
 }

 return a.exec();
}

备注:
顺序存储容器:QList,QLinkedList,QVector,QStack和QQueue。
关联容器:QMap,QMultiMap,QHash,QMultiHash和QSet。
能够存储在容器中的数据必须是可赋值数据类型。
Java 风格的遍历器指向的是两个元素之间的位置。
Stl风格的遍历器指向元素本身。

大概就看了这么些内容,找bug和理解的时间倒是用了不少。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值