參考視頻:https://www.bilibili.com/video/BV1XW411x7NU?p=45網絡
參考文檔:《Qt教程.docx》ide
說明:本文主要介紹Qt的文件系統。函數
Qt經過QIODevice提供了對 I/O 設備的抽象,這些設備具備讀寫字節塊的能力。下面是 I/O 設備的類圖(Qt5):測試
QIODevice:全部 I/O 設備類的父類,提供了字節塊讀寫的通用操做以及基本接口;ui
QFileDevice:Qt5新增長的類,提供了有關文件操做的通用實現。this
QFlie:訪問本地文件或者嵌入資源;編碼
QTemporaryFile:建立和訪問本地文件系統的臨時文件;spa
QBuffer:讀寫QbyteArray, 內存文件;操作系統
QProcess:運行外部程序,處理進程間通信;code
QAbstractSocket:全部套接字類的父類;
QTcpSocket:TCP協議網絡數據傳輸;
QUdpSocket:傳輸 UDP 報文;
QSslSocket:使用 SSL/TLS 傳輸數據;
QFile提供了從文件中讀取和寫入數據的能力。
咱們一般會將文件路徑做爲參數傳給QFile的構造函數。不過也能夠在建立好對象最後,使用setFileName()來修改。
QFile主要提供了有關文件的各類操做,好比打開文件、關閉文件、刷新文件等。咱們能夠使用QDataStream或QTextStream類來讀寫文件,也能夠使用QIODevice類提供的read()、readLine()、readAll()以及write()這樣的函數。
值得注意的是,有關文件自己的信息,好比文件名、文件所在目錄的名字等,則是經過QFileInfo獲取,而不是本身分析文件路徑字符串。
(1)打開、讀取、寫入文件
功能:建立兩個按鈕,「read file」按鈕打開一個文本框,讀取文件的內容到textEdit;「save file」按鈕將textEdit中的內容保存到一個文件中。界面以下:
讀取文件使用到的函數和步驟:
1)建立一個文件對象:QFilefile(path);
2)以只讀方式打開文件:boolisOk=file.open(QIODevice::ReadOnly);
3)讀取文件的內容有多種方式,這裏介紹兩種:
一次性讀取文件所有內容:QByteArrayarray=file.readAll();
一次只讀取一行:
1 QByteArray array;
2 while (file.atEnd() == false) {
3 //讀一行
4 array += file.readLine();
5 }
4)關閉文件:file.close();
寫入文件用到的函數和步驟:
1)建立文件對象:QFile file;
2)關聯文件名字:file.setFileName(path);
3)以只寫方式打開文件:bool isOK = file.open(QIODevice::WriteOnly);
4)向文件中寫入內容:file.write(str);
5)關閉文件:file.close();
完整代碼:
1 #include "widget.h"
2 #include "ui_widget.h"
3 #include <QFile>
4 #include <QFileDialog>
5 #include <QByteArray>
6 #include <QByteArray>
7
8 Widget::Widget(QWidget *parent) : 9 QWidget(parent), 10 ui(new Ui::Widget) 11 { 12 ui->setupUi(this); 13 } 14
15 Widget::~Widget() 16 { 17 delete ui; 18 } 19
20 void Widget::on_pushButton_read_clicked() 21 { 22 QString path = QFileDialog::getOpenFileName(this, "open", "../", "TXT(*.txt)"); 23 if (path.isEmpty() == false) { 24 QFile file(path); //文件對象
25 bool isOK = file.open(QIODevice::ReadOnly); //打開文件
26 if (true == isOK) { 27 //一行一行讀取文件
28 QByteArray array; 29 while (file.atEnd() == false) { 30 array += file.readLine(); 31 } 32 ui->textEdit->setText(array); 33 file.close(); 34 } 35 } 36 } 37
38 void Widget::on_pushButton_save_clicked() 39 { 40 QString path = QFileDialog::getOpenFileName(this, "open", "../", "TXT(*.txt)"); 41 if (path.isEmpty() == false) { 42 QFile file(path); //文件對象
43 bool isOK = file.open(QIODevice::WriteOnly); //打開文件
44 if (true == isOK) { 45 //獲取文本編輯區的內容
46 QString str = ui->textEdit->toPlainText(); 47 //轉換爲本地編碼寫入
48 file.write(str.toLocal8Bit()); 49 file.close(); 50 } 51 } 52 }
運行測試:
上述代碼中,打開文件使用的是系統默認的編碼格式:UTF-8,若是打開其它編碼格式的文件就會亂碼。
(2)獲取文件信息
好比獲取文件的名字、文件後綴、文件大小、文件建立時間等信息。
經過QFileInfo類來實現的。這個很簡單,直接給出測試代碼:
1 Widget::Widget(QWidget *parent) : 2 QWidget(parent), 3 ui(new Ui::Widget) 4 { 5 ui->setupUi(this); 6
7 QFileInfo info("../demo.txt"); 8 qDebug() << "文件名字" << info.fileName().toUtf8().data(); 9 qDebug() << "文件後綴" << info.suffix(); 10 qDebug() << "文件大小" << info.size(); 11 qDebug() << "文件建立時間" << info.created().toString("yyyy-MM-dd hh:mm:ss"); 12 qDebug() << "文件路徑" << info.filePath(); 13 }
(3)QDataStream讀寫文件
QDataStream提供了基於QIODevice的二進制數據的序列化。數據流是一種二進制流,這種流徹底不依賴於底層操做系統、CPU 或者字節順序(大端或小端)。
QDataStream既可以存取 C++ 基本類型,如 int、char、short 等,也能夠存取複雜的數據類型,例如自定義的類。實際上,QDataStream對於類的存儲,是將複雜的類分割爲不少基本單元實現的。
測試代碼:建立兩個函數,writeData()寫文件,readData()讀文件。
1 #include "widget.h"
2 #include "ui_widget.h"
3 #include <QDataStream>
4 #include <QFile>
5 #include <QDebug>
6
7 #define cout qDebug() << "[" << __FILE__ <<":" << __LINE__ << "]"
8
9
10 Widget::Widget(QWidget *parent) : 11 QWidget(parent), 12 ui(new Ui::Widget) 13 { 14 ui->setupUi(this); 15
16 writeData(); 17 readData(); 18 } 19
20 Widget::~Widget() 21 { 22 delete ui; 23 } 24
25 void Widget::writeData() 26 { 27 //建立文件對象
28 QFile file("../text.txt"); 29 //打開文件,只寫方式
30 bool isOK = file.open(QIODevice::WriteOnly); 31 if (true == isOK) { 32 //建立數據流,和file文件關聯 33 //往數據流中寫數據,至關於往文件裏寫數據(二進制)
34 QDataStream stream(&file); 35 stream << QString("主要看氣質") << 250; 36 file.close(); 37 } 38 } 39
40 void Widget::readData() 41 { 42 //建立文件對象
43 QFile file("../text.txt"); 44 //打開文件,只讀方式
45 bool isOK = file.open(QIODevice::ReadOnly); 46 if (true == isOK) { 47 //建立數據流,和file文件關聯 48 //從數據流中讀數據,至關於從文件裏讀數據(二進制)
49 QDataStream stream(&file); 50 //讀的時候,按寫的順序取數據
51 QString str; 52 int a; 53 stream >> str >> a; 54 cout << str << a; 55 file.close(); 56 } 57 }
運行測試:
打印輸出:[ ..\file_2\widget.cpp : 54 ] "主要看氣質" 250
咱們打開text.txt文件,會看到是亂碼的,由於是二進制文件。
(4)QTextStream讀寫文件
QTextStream是操做純文本文件的。QTextStream會自動將 Unicode 編碼同操做系統的編碼進行轉換,這一操做對開發人員是透明的。它也會將換行符進行轉換,一樣不須要本身處理。
QTextStream使用 16 位的QChar做爲基礎的數據存儲單位,一樣,它也支持 C++ 標準類型,如 int 等。實際上,這是將這種標準類型與字符串進行了相互轉換。
測試代碼:
1 #include "widget.h"
2 #include "ui_widget.h"
3 #include <QFile>
4 #include <QTextStream>
5 #include <QDebug>
6 #include <QFileDialog>
7
8 #define cout qDebug() << "[" << __FILE__ <<":" << __LINE__ << "]"
9
10 Widget::Widget(QWidget *parent) : 11 QWidget(parent), 12 ui(new Ui::Widget) 13 { 14 ui->setupUi(this); 15
16 writeData(); 17 readData(); 18 } 19
20 Widget::~Widget() 21 { 22 delete ui; 23 } 24
25 void Widget::writeData() 26 { 27 QFile file; 28 file.setFileName("../demo.txt"); 29 bool isOK = file.open(QIODevice::WriteOnly); 30 if (true == isOK) { 31 QTextStream stream(&file); 32 //指定編碼
33 stream.setCodec("UTF-8"); 34 stream << QString("主要看氣質") << 250; 35 file.close(); 36 } 37 } 38
39 void Widget::readData() 40 { 41 QFile file; 42 file.setFileName("../demo.txt"); 43 bool isOK = file.open(QIODevice::ReadOnly); 44 if (true == isOK) { 45 QTextStream stream(&file); 46 stream.setCodec("UTF-8"); 47 //讀取出來的就是字符串
48 QString str = stream.readAll(); 49 cout << str; 50 file.close(); 51 } 52 }
運行測試:
打印輸出:[ ..\file_3\widget.cpp : 53 ] "主要看氣質250"
打開demo.txt文件,能夠發現文件是可讀的,不會亂碼。
(5)QBuffer讀寫文件
QBuffer建立的是內存文件。
直接給出測試代碼:
1 Widget::Widget(QWidget *parent) : 2 QWidget(parent), 3 ui(new Ui::Widget) 4 { 5 ui->setupUi(this); 6 7 //建立內存文件 8 QByteArray array; 9 QBuffer memfile(&array); 10 memfile.open(QIODevice::WriteOnly); 11 memfile.write("111111111111"); 12 memfile.write("222222222222"); 13 memfile.close(); 14 qDebug() << memfile.buffer(); 15 qDebug() << "array" << array; 16 17 QBuffer memfile1; 18 QDataStream stream(&memfile1); 19 memfile1.open(QIODevice::WriteOnly); 20 stream << QString("測試") << 250; 21 memfile1.close(); 22 23 memfile1.open(QIODevice::ReadOnly); 24 QDataStream in; 25 in.setDevice(&memfile1); 26 QString str; 27 int a; 28 in >> str >> a; 29 memfile1.close(); 30 qDebug() << str.toUtf8().data() << a; 31 }