前面學習了多態,現在我們開始學習一些C++的武器,也就是一些常用的類庫。程序在運行時產生的數據都屬於臨時數據,程序一旦運行結束都會被釋放。通過文件可以將數據持久化,也就是把數據寫入文件,叫序列化,程序讀取文件,顯示出各種數據。這個過程叫反序列化。這篇開始我們來學習下C++如何讀寫文件。
1.文件分文本文件和二進制文件
1)文本文件,文件以文本的ASCII碼形式存儲在計算機中
2)二進制文件,文件以文本的二進制形式存儲在計算機中,用戶一般不能直接讀懂它們。(都是01這樣的數據)
2.C++操作文件的三大類
1.ofstream:寫操作,outputStream
2.ifstream: 讀操作 inputStream, f表示file
3.fstream: 讀寫操作
3.寫文本文件的5個步驟
1)包含頭文件
#include <fstream>
2) 創建流對象
ofstream ofs;
3) 打開文件
ofs.open("文件路徑", 打開方式);
4)寫數據
ofs << "寫入數據";
5)關閉文件流
ofs.close();
下面這個表格,統計了各種打開方式
上面的打開方式可以結合一起使用,例如 ios::ate | ios::binary
使用管道符連接多個打開方式。
下面來寫一個寫文本文件的代碼,例如就test.txt吧
#include <iostream>
#include <fstream>
using namespace std;
void test01()
{
//2.創建流對象
ofstream ofs;
//3.打開流文件
ofs.open("test.txt", ios::ate | ios::out);
//4.寫入文件
ofs << "這是寫入文件練習";
//5.關閉流對象
ofs.close();
}
int main()
{
test01();
system("pause");
return 0;
}
運行結果
4.讀文本文件
讀文件的步驟如下
1.包含頭文件
#include <fstream>
2.創建流對象
ifstream ifs;
3.打開文件並判斷文件是否打開成功
ifs.open("文件路徑", 打開方式);
4.讀數據
四種方式讀取
5. 關閉文件
ifs.close()
這次我們要讀文件的內容如下
相關代碼
#include <iostream>
#include <fstream>
using namespace std;
void test01()
{
//2.創建流對象
ifstream ifs;
//3.打開流文件
ifs.open("test.txt", ios::in);
//判斷文件是否打開成功
if( !ifs.is_open())
{
cout << "打開文件失敗!" << endl;
return;
}
//4.讀文件,第一種方法
char buf[1024] = {0};
while (ifs >> buf)
{
cout << buf << endl;
}
//5.關閉流對象
ifs.close();
}
int main()
{
test01();
system("pause");
return 0;
}
運行結果
上面介紹了第一種讀文件,大致原理是,先初始化一個大小爲1024的字節數組,然後讀取一行就存入buf字節數組。
再來看看其他三種讀文件的方法(剩下代碼都相同)
//4.讀文件,第二種方法
char buf[1024] = {0};
while (ifs.getline(buf, 1024))
{
cout << buf << endl;
}
第三種,使用字符串方法
//4.讀文件,第三種方法
string buf;
while (getline(ifs, buf))
{
cout << buf << endl;
}
第四種
//4. 讀文件,第四種,不推薦
char c;
while ( (c = ifs.get()) != EOF) // EOF: end of file
{
cout << c;
}
第四種,這裏不推薦,效率很慢。原理是一次只讀取一個字符,存到c,然後判斷是否讀到文件結束位置,EOF就是一個標記位置。這裏讀取一個字符,打印出一個字符,其中換行也是一個字符。