跳到正文

Wiki

檔案操作

約 3 分鐘閱讀

本文由簡體中文內容確定性轉換,並受版本化術語表保護。

1.檔案操作

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

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

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

檔案型別分為兩種:

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

操作檔案的三大類:

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

1.1.文本檔案

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 <fstream>

void test01()
{
	ofstream ofs;
	ofs.open("test.txt", ios::out);

	ofs << "姓名:张三" << endl;
	ofs << "性别:男" << endl;
	ofs << "年龄:18" << endl;

	ofs.close();
}

int main() {
    // 程序从 main 函数开始执行,下面的语句会按顺序运行。

	test01();


	// 返回 0 表示程序正常结束。
	return 0;
}

執行結果: 終端沒有輸出;程式會在當前目錄生成 test.txt,檔案內容為:

姓名:张三
性别:男
年龄:18

總結:

  • 檔案操作必須包含標頭檔案 fstream
  • 讀檔案可以利用 ofstream ,或者fstream類
  • 開啟檔案時候需要指定操作檔案的路徑,以及開啟方式
  • 利用<<可以向檔案中寫資料
  • 操作完畢,要關閉檔案

1.1.2.讀檔案

讀檔案與寫檔案步驟相似,但是讀取方式相對於比較多

讀檔案步驟如下:

  1. 包含標頭檔案

    #include <fstream>

  2. 建立流物件

    ifstream ifs;

  3. 開啟檔案並判斷檔案是否開啟成功

    ifs.open("檔案路徑",開啟方式);

  4. 讀資料

    四種方式讀取

  5. 關閉檔案

    ifs.close();

示例:

#include <fstream>
#include <string>
void test01()
{
	ifstream ifs;
	ifs.open("test.txt", ios::in);

	if (!ifs.is_open())
	{
		cout << "文件打开失败" << endl;
		return;
	}

	//第一种方式
	//char buf[1024] = { 0 };
	//while (ifs >> buf)
	//{
	//	cout << buf << endl;
	//}

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

	//第三种
	//string buf;
	//while (getline(ifs, buf))
	//{
	//	cout << buf << endl;
	//}

	char c;
	while ((c = ifs.get()) != EOF)
	{
		cout << c;
	}

	ifs.close();

}

int main() {

	test01();


	return 0;
}

執行結果(以下為按提示依次輸入 102030……時的一次示例;型別大小或型別名可能隨編譯器和平臺變化):

姓名:张三
性别:男
年龄:18

總結:

  • 讀檔案可以利用 ifstream ,或者fstream類
  • 利用is_open函式可以判斷檔案是否開啟成功
  • close 關閉檔案

1.2.二進位制檔案

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

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

1.2.1.寫檔案

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

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

引數解釋:字元指標buffer指向記憶體中一段儲存空間。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、写文件
	ofs.write((const char *)&p, sizeof(p));

	//5、关闭文件
	ofs.close();
}

int main() {

	test01();


	return 0;
}

執行結果: 終端沒有輸出;程式會在當前目錄生成二進位制檔案 person.txt,其中寫入姓名為“張三”、年齡為 18Person 物件。

總結:

  • 檔案輸出流物件 可以通過write函式,以二進位制方式寫資料

1.2.2.讀檔案

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

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

引數解釋:字元指標buffer指向記憶體中一段儲存空間。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() {
    // 程序从 main 函数开始执行,下面的语句会按顺序运行。

	test01();


	// 返回 0 表示程序正常结束。
	return 0;
}

執行結果(型別大小或型別名可能隨編譯器和平臺變化):

姓名: 张三 年龄: 18
  • 檔案輸入流物件 可以通過read函式,以二進位制方式讀資料