檔案操作
程式執行時產生的資料都屬於臨時資料,程式一旦執行結束都會被釋放。
透過檔案可以將資料持久化
C++中對檔案操作需要包含標頭檔案 <fstream>
檔案型別分為兩種:
1.文字檔案
檔案以文字的ASCII碼形式儲存在計算機中
2.二進位制檔案:
檔案以文字的二進位制形式儲存在計算機中,使用者一般不能直接讀懂它們。
操作檔案的三大類:
- ofstream:寫操作
- ifstream:讀操作
- fstream:讀寫操作
1、文字檔案
1.1寫檔案
1.包含標頭檔案 #include<fstream>
2.建立流物件ofstream ofs;
3.開啟檔案ofs.open("檔案路徑",開啟方式);
4.寫資料ofs<<"寫入的資料";
5.關閉檔案ofs.close();
檔案的開啟方式:
ios::in //為 讀 檔案而開啟檔案
ios::out //為 寫 檔案而開啟檔案
ios::ate //初始位置:檔案尾
ios::app //追加方式寫檔案
ios::trunc //如果檔案存在先刪除,再建立
ios::binary //二進位制方式
注意:檔案開啟方式可以配合使用,利用"|"運算子
例如:用二進位制方式寫檔案ios::binary | ios::out
#include<iostream>
using namespace std;
#include<fstream> //1、包含標頭檔案
void test()
{
ofstream ofs; //2、建立流物件
ofs.open("test.txt", ios::out); //3、指定開啟方式
//4、寫內容
ofs << "姓名:張三" << endl;
ofs << "性別:男" << endl;
ofs << "年齡:18" << endl;
//5、關閉檔案
ofs.close();
}
int main()
{
test();
return 0;
}
總結:
1.檔案操作必須包含標頭檔案fsteam
2.讀檔案可以利用ofstream,或者fstream類
3.開啟檔案時候需要指定操作檔案的路徑,以及開啟方式
4.利用"<<"可以向檔案中寫資料
5.操作完畢,要關閉檔案
1.2讀檔案
讀檔案與寫檔案步驟相似,但是讀取方式相對比較多。
讀檔案步驟如下:
1.包含標頭檔案#include<fstream>
2.建立流物件ifstream ifs;
3.開啟檔案並判斷檔案是否開啟成功ifs.open("檔案路徑",開啟方式);
4.讀資料:四種方式讀取
5.關閉檔案ifs.close();
#include<iostream>
#include<fstream> //1、包含標頭檔案
#include<string>
using namespace std;
void test()
{
//2、建立流物件
ifstream ifs;
//3、指定開啟方式
ifs.open("test.txt", ios::in);
//判斷是否開啟
if (!ifs.is_open())
{
cout << "檔案開啟失敗" << endl;
return;
}
//4、讀內容
//第一種方式
char buf[1024] = { 0 }; //設定一個大小為1024的字元陣列,初始化全為0
//把檔案中的資料全部放在陣列中 利用 "if >>" 右移運算子
while (ifs >> buf)
{
cout << buf << endl;
}
//第二種方式
char buf[1024] = { 0 };
//函式引數說明:ifs.getline(第一個元素放的首地址,要最多讀多少個位元組數)
while (ifs.getline(buf, sizeof(buf)))
{
cout << buf << endl;
}
//第三種
string buf;
//getline全域性函式,引數說明:(基礎輸入流,準備放入的地方)
while ( getline(ifs, buf))
{
cout << buf << endl;
}
//第四種,不太推薦用,效率低
char c; //一次只讀一個字元
while ((c = ifs.get()) != EOF) //EOF是 end of file 檔案尾部標誌
{
cout << c;
}
//5、關閉檔案
ifs.close();
}
int main()
{
test();
return 0;
}
總結:
1.讀檔案可以利用ifstream,或者fstream類
2.利用is_open函式可以判斷檔案是否開啟成功
3.close關閉檔案
2、二進位制檔案
以二進位制的方式對檔案進行讀寫操作
開啟方式要制定為ios::binary
2.1寫檔案
二進位制方式寫檔案主要利用流物件呼叫成員函式write
函式原型:ostream& write(const char * buffer, int len);
引數解釋:字元指標buff指向記憶體中一段儲存空間。len是讀寫的位元組數。
例子:
#include <fstream>
#include <string>
class Person
{
public:
char m_Name[64];
int m_Age;
};
//二進位制檔案 寫檔案
void test01()
{
//1、包含標頭檔案
//2、建立輸出流物件
ofstream ofs("person.txt", ios::out | ios::binary);
//3、開啟檔案
//ofs.open("person.txt", ios::out | ios::binary);
Person p = {"張三" , 18};
//4、寫檔案
//強轉稱const char * ,因為如果直接對p進行取地址,返回的是一個Person型,write函式要求引數是const char型,所以要強轉
ofs.write((const char *)&p, sizeof(p));
//5、關閉檔案
ofs.close();
}
int main() {
test01();
return 0;
}
總結:
檔案輸出流物件 可以透過write函式,以二進位制方式寫資料。
2.2讀檔案
二進位制方式讀檔案主要利用流物件呼叫成員函式read
函式原型:isteam& read(char *buff, int len);
引數解釋:字元指標buff指向記憶體中一段儲存空間。len是讀寫的位元組數。
#include <fstream>
#include <string>
class Person
{
public:
char m_Name[64];
int m_Age;
};
void test01()
{
ifstream ifs("person.txt", ios::in | ios::binary);
if (!ifs.is_open())
{
cout << "檔案開啟失敗" << endl;
}
Person p;
ifs.read((char *)&p, sizeof(p));
cout << "姓名: " << p.m_Name << " 年齡: " << p.m_Age << endl;
}
int main() {
test01();
return 0;
}
總結:
檔案輸出流物件 可以透過read函式,以二進位制方式讀資料。