2.8檔案操作

蓝色的海嗷發表於2024-03-20

檔案操作

程式執行時產生的資料都屬於臨時資料,程式一旦執行結束都會被釋放。

透過檔案可以將資料持久化

C++中對檔案操作需要包含標頭檔案 <fstream>

檔案型別分為兩種:
1.文字檔案
檔案以文字的ASCII碼形式儲存在計算機中
2.二進位制檔案:
檔案以文字的二進位制形式儲存在計算機中,使用者一般不能直接讀懂它們。

操作檔案的三大類:

  1. ofstream:寫操作
  2. ifstream:讀操作
  3. 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函式,以二進位制方式讀資料。