|
本帖最后由 正点原子 于 2021-8-11 12:28 编辑
1)实验平台:正点原子i.MX6ULL Linux阿尔法开发板
2) 章节摘自【正点原子】《I.MX6U嵌入式Qt开发指南》
3)购买链接:https://item.taobao.com/item.htm?&id=603672744434
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/arm-linux/zdyz-i.mx6ull.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子Linux技术交流群:1027879335
第八章 文本读写
在很多时候我们需要读写文本文件进行读写,比如写个Mp3音乐播放器需要读Mp3歌词里的文本,比如修改了一个txt文件后保存,就需要对这个文件进行读写操作。本章介绍简单的文本文件读写,内容精简,让大家了解文本读写的基本操作。
8.1 QFile读写文本
QFile类提供了读取和写入文件的接口。在嵌入式里如果需要读写文件,最简单的方法就是用Qfile,在第14.2和14.3小节就是利用了QFile来读写Linux下的字符设备(可把字符设备当作一个文本处理,linux下一切皆文件),虽然只是写‘0’或‘1’,但也是对文件(文本)的读写了。
QFile是一个读写文本、二进制文件和资源的I/O设备。QFile可以自己使用,也可以更方便地与QTextStream或QDataStream一起使用。
文件名通常在构造函数中传递,但它可以在任何时候使用setFileName()设置。不支持使用其他分隔符(例如'\')。所以在Windows、 Linux或者Mac里文件的路径都是用'/'。不能看到Windows的路径是'\',我们就可以在写入的文件路径里添加这个'\'。不管操作系统是什么,QFile的文件分隔符都是'/'。
可以使用exists()检查文件是否存在,并使用remove()删除文件。(更高级的文件系统相关操作由QFileInfo和QDir提供。)用open()打开文件,用close()关闭文件,用flush()刷新文件。通常使用QDataStream或QTextStream读写数据,但也可以调用QIODevice继承的函数read()、readLine()、readAll()、write()。QFile还继承getChar()、putChar()和ungetChar(),它们一次只处理一个字符。文件的大小由size()返回。可以使用pos()获取当前文件位置,也可以使用seek()移动到新的文件位置。如果已经到达文件的末尾,则atEnd()返回true。
QFile::open()函数打开文件时需要传递 QIODevice::OpenModeFlag 枚举类型的参数,决定文件以什么方式打开,QIODevice::OpenModeFlag类型的主要取值如下:
QIODevice::ReadOnly:以只读方式打开文件,用于载入文件。
QIODevice::WriteOnly:以只写方式打开文件,用于保存文件。
QIODevice::ReadWrite:以读写方式打开。
QIODevice::Append:以添加模式打开,新写入文件的数据添加到文件尾部。
QIODevice::Truncate:以截取方式打开文件,文件原有的内容全部被删除。
QIODevice::Text:以文本方式打开文件,读取时“\n”被自动翻译为换行符,写入时字符串结束符会自动翻译为系统平台的编码,如 Windows 平台下是“\r\n”。
这些取值可以组合,例如 QIODevice::ReadOnly | QIODevice::Text 表示以只读和文本方式打开文件。
使用QFile对一个文本文件的操作流程是以下这样的。
8.1.1 应用实例
例01_qfile,读写文本(难度:简单)。项目路径为Qt/2/01_qfile。2是代表第二篇的例程父目录。
在头文件“mainwindow.h”具体代码如下。
mainwindow.h编程后的代码
- /******************************************************************
- Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
- * @projectName 01_qfile
- * @brief mainwindow.h
- * @author Deng Zhimao
- * @email <a href="mailto:1252699831@qq.com">1252699831@qq.com</a>
- * @net <a href="www.openedv.com" target="_blank">www.openedv.com</a>
- * @date 2021-03-27
- *******************************************************************/
- 1 #ifndef MAINWINDOW_H
- 2 #define MAINWINDOW_H
- 3
- 4 #include <QMainWindow>
- 5 #include <QTextEdit>
- 6 #include <QFile>
- 7 #include <QVBoxLayout>
- 8 #include <QHBoxLayout>
- 9 #include <QPushButton>
- 10
- 11 class MainWindow : public QMainWindow
- 12 {
- 13 Q_OBJECT
- 14
- 15 public:
- 16 MainWindow(QWidget *parent = nullptr);
- 17 ~MainWindow();
- 18
- 19 private:
- 20 /* 用于读取文件后显示 */
- 21 QTextEdit *textEdit;
- 22
- 23 /* QFile类型对象 */
- 24 QFile file;
- 25
- 26 /* 水平布局 */
- 27 QHBoxLayout *hBoxLayout;
- 28
- 29 /* 垂直布局 */
- 30 QVBoxLayout *vBoxLayout;
- 31
- 32 /* 水平布局Widget */
- 33 QWidget *hWidget;
- 34
- 35 /* 垂直布局Widget */
- 36 QWidget *vWidget;
- 37
- 38 /* 打开文件按钮 */
- 39 QPushButton *openPushButton;
- 40
- 41 /* 关闭文件按钮 */
- 42 QPushButton *closePushButton;
- 43
- 44 private slots:
- 45
- 46 /* 打开文本文件 */
- 47 bool openFile();
- 48
- 49 /* 关闭文本文件 */
- 50 void closeFile();
- 51 };
复制代码
52 #endif // MAINWINDOW_H
在源文件“mainwindow.cpp”具体代码如下。
mainwindow.cpp编程后的代码
- /******************************************************************
- Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
- * @projectName 01_qfile
- * @brief mainwindow.cpp
- * @author Deng Zhimao
- * @email <a href="mailto:1252699831@qq.com">1252699831@qq.com</a>
- * @net <a href="www.openedv.com" target="_blank">www.openedv.com</a>
- * @date 2021-03-27
- *******************************************************************/
- #include "mainwindow.h"
- #include <QFileDialog>
- #include <QDebug>
- 1 MainWindow::MainWindow(QWidget *parent)
- 2 : QMainWindow(parent)
- 3 {
- 4 /* 设置窗口的位置与大小 */
- 5 this->setGeometry(0, 0, 800, 480);
- 6
- 7 /* 布局设置 */
- 8 textEdit = new QTextEdit();
- 9 vBoxLayout = new QVBoxLayout();
- 10 hBoxLayout = new QHBoxLayout();
- 11 vWidget = new QWidget();
- 12 hWidget = new QWidget();
- 13 openPushButton = new QPushButton();
- 14 closePushButton = new QPushButton();
- 15
- 16 /* 设置两个按钮的大小 */
- 17 openPushButton->setMinimumHeight(50);
- 18 openPushButton->setMaximumWidth(120);
- 19 closePushButton->setMinimumHeight(50);
- 20 closePushButton->setMaximumWidth(120);
- 21
- 22 /* 设置两个按钮的文本 */
- 23 openPushButton->setText("打开");
- 24 closePushButton->setText("关闭");
- 25
- 26 /* 设置关闭按钮为不可用属性,需要打开文件才设置为可用属性 */
- 27 closePushButton->setEnabled(false);
- 28
- 29 /* 水平布局 */
- 30 hBoxLayout->addWidget(openPushButton);
- 31 hBoxLayout->addWidget(closePushButton);
- 32 hWidget->setLayout(hBoxLayout);
- 33
- 34 /* 垂直布局 */
- 35 vBoxLayout->addWidget(textEdit);
- 36 vBoxLayout->addWidget(hWidget);
- 37 vWidget->setLayout(vBoxLayout);
- 38
- 39 /* 居中 */
- 40 setCentralWidget(vWidget);
- 41
- 42 /* 信号槽连接 */
- 43 connect(openPushButton, SIGNAL(clicked()),
- 44 this, SLOT(openFile()));
- 45 connect(closePushButton, SIGNAL(clicked()),
- 46 this, SLOT(closeFile()));
- 47 }
- 48
- 49 MainWindow::~MainWindow()
- 50 {
- 51 }
- 52
- 53 bool MainWindow::openFile()
- 54 {
- 55 /* 获取文件的路径 */
- 56 QString fileName = QFileDialog::getOpenFileName(this);
- 57
- 58 /* 指向文件 */
- 59 file.setFileName(fileName);
- 60
- 61 /* 判断文件是否存在 */
- 62 if (!file.exists())
- 63 return false;
- 64
- 65 /* 以读写的方式打开 */
- 66 if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
- 67 return false;
- 68
- 69 /* 读取文本到textEdit */
- 70 textEdit->setPlainText(file.readAll());
- 71
- 72 /* 设置打开按钮不可用,需要关闭再打开 */
- 73 openPushButton->setEnabled(false);
- 74
- 75 /* 设置关闭按钮为可用属性 */
- 76 closePushButton->setEnabled(true);
- 77
- 78 /* 关闭文件 */
- 79 file.close();
- 80
- 81 return true;
- 82 }
- 83
- 84 void MainWindow::closeFile()
- 85 {
- 86 /* 检测打开按钮是否可用,不可用时,说明已经打开了文件 */
- 87 if (!openPushButton->isEnabled()) {
- 88 /* 获取textEdit的文本内容 */
- 89 QString str = textEdit->toPlainText();
- 90
- 91 /* 以只读的方式打开 */
- 92 if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
- 93 return;
- 94
- 95 /* 转换为字节数组 */
- 96 QByteArray strBytes = str.toUtf8();
- 97
- 98 /* 写入文件 */
- 99 file.write(strBytes, strBytes.length());
- 100
- 101 /* 清空textEdit的显示内容 */
- 102 textEdit->clear();
- 103
- 104 /* 关闭文件 */
- 105 file.close();
- 106
- 107 /* 重新设置打开和关闭按钮的属性 */
- 108 openPushButton->setEnabled(true);
- 109 closePushButton->setEnabled(false);
- 110 }
- 111 }
复制代码
8.1.2 程序运行效果
点击打开。
调用系统打开文件的窗口。选择项目路径下的“测试.txt”。
打开后,文本的内容如下,可以进行修改,修改后点击关闭就会写入到此文件里。本例仅仅用两个按钮和一个文本编辑框完成,内容简洁易懂。但是在实际项目里不是用QPushButton来做打开文件和关闭文件的,一般设计于在菜单栏里用QAction来做。包括添加复制、粘贴、另存为、关闭、等等。可以仿照Windows里的记事本,用Qt写一个类似的软件完全可以。
8.2 QTextStream读写文本
QTextStream类为读写文本提供了一个方便的接口,常与QFile结合使用。QTextStream可以在QIODevice、QByteArray或QString上操作。使用QTextStream的流操作符,您可以方便地读写单词、行和数字。为了生成文本,QTextStream支持字段填充和对齐的格式化选项,以及数字的格式化。看到Stream这个名词就知道,它与流操作有关,那么我们可以使用C++的操作符“<<”和“>>”(流提取运算符和流插入运算符)进行操作流了。
8.2.1 应用实例
例02_qtextstream,文本流读写文本(难度:简单)。项目路径为Qt/2/02_qtextstream。QTextStream的例子与QFile的一样,只是在QFile的例子里加入了QTextStream。下面只写出不同部分的代码。详细直接打开项目查看。
在源文件“mainwindow.cpp”具体代码如下。不同的地方已经用红色字体标出。
mainwindow.cpp编程后的代码
- 53 bool MainWindow::openFile()
- 54 {
- 55 /* 获取文件的路径 */
- 56 QString fileName = QFileDialog::getOpenFileName(this);
- 57
- 58 /* 指向文件 */
- 59 file.setFileName(fileName);
- 60
- 61 /* 判断文件是否存在 */
- 62 if (!file.exists())
- 63 return false;
- 64
- 65 /* 以读写的方式打开 */
- 66 if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
- 67 return false;
- 68
- 69 /* 使用文本流读取文件 */
- 70 QTextStream stream(&file);
- 71
- 72 /* 读取文本到textEdit */
- 73 textEdit->setPlainText(stream.readAll());
- 74
- 75 /* 设置打开按钮不可用,需要关闭再打开 */
- 76 openPushButton->setEnabled(false);
- 77
- 78 /* 设置关闭按钮为可用属性 */
- 79 closePushButton->setEnabled(true);
- 80
- 81 /* 关闭文件 */
- 82 file.close();
- 83
- 84 return true;
- 85 }
- 86
- 87 void MainWindow::closeFile()
- 88 {
- 89 /* 检测打开按钮是否可用,不可用时,说明已经打开了文件 */
- 90 if (!openPushButton->isEnabled()) {
- 91
- 92 /* 以只读的方式打开 */
- 93 if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
- 94 return;
- 95
- 96 /* 用文本流读取文件 */
- 97 QTextStream stream(&file);
- 98
- 99 /* 获取textEdit的文本内容,转为字符串 */
- 100 QString str = textEdit->toPlainText();
- 101
- 102 /* 使用流提取运算符,写入文本流 */
- 103 stream<<str;
- 104
- 105 /* 清空textEdit的显示内容 */
- 106 textEdit->clear();
- 107
- 108 /* 关闭文件 */
- 109 file.close();
- 110
- 111 /* 重新设置打开和关闭按钮的属性 */
- 112 openPushButton->setEnabled(true);
- 113 closePushButton->setEnabled(false);
- 114 }
- 115 }
复制代码
8.2.2 程序运行效果
与上一小节(8.1.2小节)一样。使用QFile与QTextStream感觉例子看上去没区别。主要是QTextStream还支持字段填充和对齐的格式化选项,例子没有体现出来而已,等我们用到一些特性时还是有区别的。
|
-
阿莫论坛20周年了!感谢大家的支持与爱护!!
该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981
|