一篇文章快速搞懂Qt文件读写操作
文章图片
导读:Qt当中使用QFile类对文件进行读写操作,对文本文件也可以与QTextStream一起使用,这样读写操作会更加简便。QFileInfo可以用来获取文件的信息。QDir可以用于对文件夹进行操作。
本文字数:1000,阅读时长大约:10分钟
一、文件读操作
(1)使用QFile类
Qt封装了QFile类,方便我们对文件进行操作,可以按照如下的步骤进行:
- 使用QFile加载文件对象
- 打开文件 file.open(打开方式)
- 操作文件
- 关闭文件 file.close()
使用QFile首先用只读方式打开一个文本文件,然后用readAll()方法将文件内容一次全部读取出来,返回值是字节数组QByteArray。QByteArray用来存放二进制数据,如果想要看文字内容需要转换成QString。
QString path = QFileDialog::getOpenFileName(this, "打开文件", "D:\\temp\\"); QFile file(path); if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { return; }QByteArray allArray = file.readAll(); QString allStr = QString(allArray); file.close();
Qt默认使用utf-8的编码方式,在Linux中一般没有问题,因为Linux默认也是用utf-8。不过Windows里一般用的是gb18030,所以除非我们明确将文件保存成utf-8编码,否则在Qt代码里需要对编码做一些转换操作:
QString path = QFileDialog::getOpenFileName(this, "打开文件", "D:\\temp\\"); QFile file(path); if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { return; }QByteArray allArray = file.readAll(); QTextCodec *codec = QTextCodec::codecForName("gb18030"); QString allStr = codec->toUnicode(allArray); file.close();
我们也可以使用readLine方法一次读取一行,然后每次对一行文字进行操作:
QString path = QFileDialog::getOpenFileName(this, "打开文件", "D:\\temp\\"); QFile file(path); if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { return; }while(!file.atEnd()) { QByteArray array = file.readLine(); QString str = QString(array); } file.close();
(2)使用QTextStream类
如果操作的是文本文件,Qt还专门封装了一个处理文本流的类,我们可以一行一行的读取文本内容
QString path = QFileDialog::getOpenFileName(this, "打开文件", "D:\\temp\\"); QFile file(path); if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { return; }QTextStream in(&file); //in.setCodec("utf-8"); while (!in.atEnd()) { QString line = in.readLine(); } file.close();
二、文件写操作
(1)使用QFile类
使用QFile同样可以对文件进行写操作:
QString path = QFileDialog::getSaveFileName(this, "保存" , "D:\\temp\\", "TXT(*.txt)"); QFile file(path); file.open(QIODevice::WriteOnly | QIODevice::Text); file.write("你好"); file.close();
(2)使用QTextStream类
QTextStream类对操作符进行了重载,我们可以通过 << 操作符将字符串流入文本文件:
QString path = QFileDialog::getSaveFileName(this, "保存" , "D:\\temp\\", "TXT(*.txt)"); QFile file(path); file.open(QIODevice::WriteOnly | QIODevice::Text); QTextStream out(&file); QString str = "你好"; out << str; file.close();
三、文件信息读取
除了对文件的读写操作,Qt还封装了QFileInfo类帮助我们获取文件的元数据,比如文件大小、后缀名、创建时间、最后修改时间等等:
QString path = QFileDialog::getOpenFileName(this, "打开文件", "D:\\temp\\"); QFileInfo file(path); qDebug() << "文件名" << file.fileName(); qDebug() << "后缀名" << file.suffix(); qDebug() << "文件大小" << file.size(); qDebug() << "创建日期" << file.birthTime().toString("yyyy/MM/dd hh:mm:ss"); qDebug() << "最后修改" << file.lastModified().toString("yyyy/MM/dd hh:mm:ss");
四、文件夹的操作
QDir类可以对路径/文件夹/目录进行操作(不同的系统有不同的名称)。首先我们可以用QDir表示绝对路径,比如:
QDir("/home/user/Documents")
QDir("C:/Documents and Settings")
也可以表示相对路径,比如:
QDir("images/landscape.png")
我们可以用IsRelative()和IsAbsolute()方法来检验某个QDir对象使用的是绝对路径还是相对路径。不管用的是哪一种,两者之间也可以相互转化:
QDir directory("Documents/Letters");
QString path = directory.filePath("contents.txt");
QString absolutePath = directory.absoluteFilePath("contents.txt");
我们经常用到QDir的例子有比如检查某个路径是否存在:
QDir dir("example"); if (!dir.exists()) { qWarning("Cannot find the example directory"); }
或者查找某个路径下的文件:
QDir dir = QDir::root(); // "/" if (!dir.cd("tmp"))// "/tmp" { qWarning("Cannot find the \"/tmp\" directory"); } else { QFile file(dir.filePath("ex1.txt")); // "/tmp/ex1.txt" if (!file.open(QIODevice::ReadWrite)) { qWarning("Cannot create the file"); } }
五、文件夹的操作
Qt对文件和文件夹的操作封装了很多类,比如对文件操作可以使用QFile,文本文件的读写可以使用QTextStream,读取文件元数据可以使用QFileInfo,文件夹的操作可以使用QDir等。这些类为开发者提供了极大的便利,还有很多方法本文不能一一介绍到,感兴趣的读者也可以查阅Qt的帮助文档。
推荐阅读:
Qt信号与槽使用方法最完整总结
C++最好的图形库是什么?
Linux快速搭建C/C++开发环境
获取知识干货、增加面试经验、了解职场人生
欢迎关注微信公众号
【一篇文章快速搞懂Qt文件读写操作】
文章图片
推荐阅读
- 宽容谁
- 一个人的旅行,三亚
- 第6.2章(设置属性)
- 布丽吉特,人生绝对的赢家
- 家乡的那条小河
- 讲述,美丽聪明的海欧!
- PMSJ寻平面设计师之现代(Hyundai)
- 夜游宫|夜游宫 心语
- 增长黑客的海盗法则
- 画画吗()