每日一言
????????把大目標拆成小步,每天前進一點點,終會抵達終點。
QFile讀取文件
我們記事本要進行讀取文件、寫入文件、等等的操作,那么這個時候我們的QT有一個QT類叫做QFile這個類的話是專門對于文件操作的,所以我們來學習
我們在QT的幫助文檔這邊進行查看,會發現這邊包含了幾個公共的函數,那么他們之間有什么聯系呢?
二、QFile?與?setFileName?的關系
- 關聯文件路徑的方式
QFile?要操作文件,得知道文件路徑。有兩種常見方式:- 構造時指定:通過帶?name?參數的構造函數,比如?QFile(const QString &name)?,創建對象時就確定好要操作的文件
例如:QFile file("test.txt");?,后續對?file?的操作就圍繞?test.txt?這個文件。
- 先創建對象再設置:先用無參構造(QFile()?)或者帶父對象的構造(QFile(QObject *parent)?)創建?QFile?對象,此時對象還沒關聯具體文件,接著調用?setFileName?函數傳入文件路徑,來建立關聯,例如:
???QFile file;
??file.setFileName("test.txt");
之后就可以用 file 操作 test.txt 文件,比如打開、讀寫等
- 存在的意義
setFileName?提供了靈活設置文件路徑的能力。有些場景下,創建?QFile?對象時還不確定要操作哪個文件(比如文件路徑由用戶后續選擇、從配置中讀取等 ),就可以先創建對象,后續再用?setFileName?來指定,讓代碼邏輯更靈活。
這個是我們的運行結果,我們使用創建對象的方法,對象調用這個setFileName(“文件地址”)。
file.open(以怎么樣的方式打開)
Open的模式在這個QIODevice這個類里面
我們找到后會發現,有可讀可寫,追加等等方式,那么我們這邊選擇只讀和Text,這個Test這個的話是什么意思呢?就是簡單來說,就是 Qt 幫開發者處理了不同平臺換行符不一致的問題,讓文本的讀寫在跨平臺場景下更順暢,減少了因換行符差異帶來的適配工作量 。
那么我們通過管道(按位或)來進行連接
- |(按位或):用于組合多個選項,是打開文件時的正確寫法。
我們打開后需要進行讀取操作使用file.read()
這個操作就是,我們可以知道read里面的參數填什么,看到需要填寫一個是數組指針,一個是長度
- 參數:
- data:指向用于存儲讀取數據的 ** 字符數組(緩沖區)** 的指針。
- maxSize:指定最多讀取的字節數,即緩沖區的最大容量。
那么我們進行定義一個數組,將數組名傳進去,這邊的話我們需要對數組進行初始化,那我們就都初始化為’\0’吧,空字符
//在?C/C++?里,當你對數組進行部分初始化時(也就是只顯式初始化數組的部分元素),剩余未顯式初始化的元素會被編譯器自動初始化為對應類型的?“零值”?。
- read()?的作用:將文件內容直接復制到?context?數組的內存空間中。
例如,若文件內容是?"Hello\nWorld!"(共 12 字節),則?context?數組的前 12 個字節會被填充為對應的字符編碼(如 UTF-8),后續字節保持為?'\0'。
qDebug()?如何輸出內容?
C 風格字符串的特性:
context?是一個?char*?類型的指針,指向數組的首地址。qDebug()?會將其視為以?'\0'?結尾的 C 風格字符串,并從首地址開始逐字節讀取,直到遇到第一個?'\0'?為止。
好的,那么我們的文件會其實是會打開失敗的啊
我們進行了一個判斷,為什么可以這樣判斷?
因為
?Qt 的?QFile::open()
在 Qt 中,QFile::open()?返回bool:
- 成功打開:返回true。
- 打開失敗:返回false,可通過QFile::error()獲取具體錯誤類型。
所以我們就直接如果返回值為!1的那我們就輸出錯誤信息file open error。
還有這個read這個是失敗返回-1的,所以我們就可以當==-1的時候,我們就直接退出程序。
還有一種寫法是這樣的
?
QFile寫入文件
這個寫入文件的話也是一樣的操作,路徑、打開文件、寫入內容、關閉資源
不同的就是這個open的打開方式改為關于寫的,我這邊是只寫WriteOnly
然后我們看到上方的框框 ,我點擊寫入文件的話,如果我在這個路徑上面沒有這個文件的話就會創建一個這個文件,然后寫入了我寫的話,我們這個write的參數是可以填寫三個,一個是字符數組(c風格字符串),QByteArray、還有一個是字符串加上存入的指定的大小