今天是作息表开始的第一天,凡是都得有个好的开始,如同所期望的一样,今天规矩的按照作息表执行了一番,感觉还不错,如同表上的安排写下这篇文章来做一下学习的总结。
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和理解的时间倒是用了不少。