1. 程式人生 > 其它 >c++ 檔案操作 fstream

c++ 檔案操作 fstream

5 檔案操作

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

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

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

檔案型別分為兩種:

  1. 文字檔案 - 檔案以文字的ASCII碼形式儲存在計算機中
  2. 二進位制檔案 - 檔案以文字的 二進位制 形式儲存在計算機中,使用者一般不能直接讀懂他們

操作檔案的三大類:

  1. ofstream:寫操作
  2. ifstream: 讀操作
  3. fstream: 讀寫操作

5.1 文字檔案

5.1.1 寫檔案

寫檔案步驟如下

  • 1 包含標頭檔案 #include <ofstream>
  • 2 建立流物件 fstream ofs;
  • 3 開啟檔案 ofs.open("檔案路徑",開啟方式)
  • 4 寫資料 ofs << "寫入資料"
  • 5 關閉檔案 ofs.close();

檔案開啟方式

開啟方式 解釋
ios::in 為讀檔案而開啟檔案
ios::out 為寫檔案而開啟檔案
ios:: ate 初始位置:檔案尾部
ios::app 追加方式寫入檔案
ios::trunc 如果檔案存在,先刪除,再建立
ios::binary 二進位制方式

注意: 檔案開啟方式可以配合使用,利用|操作符

例如:用二進位制方式寫檔案 ios::binary|ios::in

#include <iostream>
#include <fstream>
using namespace std;

// 文字檔案寫檔案


void test01() {
	// 1.包含標頭檔案
	// 2. 建立檔案流物件
	fstream ofs;
	// 3. 開啟檔案
	ofs.open("C:\\Users\\DSF-LSJ\\Desktop\\tests.txt",ios::out); // 沒有檔案就會建立檔案
	// 4. 寫入文字
	ofs << "hello word";
	// 5. 關閉檔案
	ofs.close();
}


int main() {
	test01();
	return 0;
}

5.1.2 讀檔案

讀檔案步驟如下

  • 1 包含標頭檔案 #include <ofstream>
  • 2 建立流物件 fstream ifs;
  • 3 開啟檔案 ifs.open("檔案路徑",開啟方式) 判斷檔案是否開啟成功
  • 4 讀資料 四種方式讀取
  • 5 關閉檔案 ofs.close();

判讀檔案是否開啟

	if (!ifs.is_open()) {
		cout << "檔案開啟失敗" << endl;
	}

示例:

//#include <iostream>
//#include <fstream>
//using namespace std;
//
//// 文字檔案寫檔案
//
//
//void test01() {
//	// 1.包含標頭檔案
//	// 2. 建立檔案流物件
//	fstream ofs;
//	// 3. 開啟檔案
//	ofs.open("C:\\Users\\DSF-LSJ\\Desktop\\tests.txt",ios::out); // 沒有檔案就會建立檔案
//	// 4. 寫入文字
//	ofs << "hello word";
//	// 5. 關閉檔案
//	ofs.close();
//}
//
//
//int main() {
//	test01();
//	return 0;
//}

// 讀檔案
#include <iostream>
#include <fstream>
using namespace std;

void test01() {
	// 1. 匯入檔案頭
	// 2. 建立檔案流物件
	fstream ifs;
	// 3. 開啟檔案
	ifs.open("C:\\Users\\DSF-LSJ\\Desktop\\test.txt", ios::in);

	if (!ifs.is_open()) {
		cout << "檔案開啟失敗" << endl;
	}
	// 第一種 建立char陣列 通過迴圈拿到
	//char buf[1024] = { 0 }; 
	//while (ifs>>buf) {
	//	cout << buf << endl;
	//}

	// 第二種
	char buf[1024] = { 0 };
	while (ifs.getline(buf,sizeof(buf))) {
		cout << buf << endl;
	}
	ifs.close();

	// 第三種
	// pass 全域性getline ...

	// 第四種
	//char c;
	//while ( (c = ifs.get()) != EOF) {  // EOF end of file 是否讀到檔案尾部
	//	cout << c;
	//}
}

int main() {
	test01();
	return 0;
}

5.2 二進位制檔案

以二進位制的方式進行讀寫操作

開啟方式指定為: ios::binary

5.2.1 寫檔案

二進位制方式寫檔案主要利用物件呼叫成員函式write

函式原型:ostream & write(const char *buffer ,int len)

引數解釋: 字元指標buffer 指向記憶體中一段儲存空間,len是讀寫的位元組數

示例:

#include <iostream>
#include <fstream>
using namespace std;
// 二進位制寫檔案
class Person {
public:
	char m_Name[64];  // 姓名
	int m_Age;        // 年齡
};

void test01() {
	// 1.包含標頭檔案
	// 2.建立流物件
	fstream ofs;
	// 3.開啟檔案
	ofs.open("test.txt",ios::out|ios::binary);
	// 4.寫入檔案 *******************************
	Person p = { "張三",18 };
	ofs.write((const char*)&p, sizeof(Person));
	// 5.關閉檔案
	ofs.close();
}

int main() {
	test01();
	return 0;
}

5.2.2 讀檔案

二進位制方式讀檔案主要利用流物件呼叫成員函式read

函式原型:istream& read(char * buffer,int len)

引數解釋: 字元指標buffer指向一段記憶體空間,len是讀寫的位元組數

示例:


#include <iostream>
#include <fstream>
using namespace std;
// 二進位制讀檔案
class Person {
public:
	char m_Name[64];  // 姓名
	int m_Age;        // 年齡
};

void test01() {
	// 1.包含標頭檔案
	// 2.建立流物件
	fstream ofs;
	// 3.開啟檔案
	ofs.open("test.txt", ios::in | ios::binary);

	// 4.讀檔案 **************************
	Person p;
	ofs.read((char * )&p, sizeof(Person));
	cout << p.m_Age << endl;
	cout << p.m_Name << endl;

	// 5.關閉檔案
	ofs.close();
}

int main() {
	test01();
	return 0;
}