Wiki
檔案操作
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
1.檔案操作
程式執行時產生的資料都屬於臨時資料,程式一旦執行結束都會被釋放
通過檔案可以將資料持久化
C++中對檔案操作需要包含標頭檔案 ==< fstream >==
檔案型別分為兩種:
- 文本檔案 - 檔案以文本的ASCII碼形式儲存在計算機中
- 二進位制檔案 - 檔案以文本的二進位制形式儲存在計算機中,使用者一般不能直接讀懂它們
操作檔案的三大類:
- ofstream:寫操作
- ifstream: 讀操作
- fstream : 讀寫操作
1.1.文本檔案
1.1.1.寫檔案
寫檔案步驟如下:
-
包含標頭檔案
#include <fstream>
-
建立流物件
ofstream ofs;
-
開啟檔案
ofs.open("檔案路徑",開啟方式);
-
寫資料
ofs << "寫入的資料";
-
關閉檔案
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.讀檔案
讀檔案與寫檔案步驟相似,但是讀取方式相對於比較多
讀檔案步驟如下:
-
包含標頭檔案
#include <fstream>
-
建立流物件
ifstream ifs;
-
開啟檔案並判斷檔案是否開啟成功
ifs.open("檔案路徑",開啟方式);
-
讀資料
四種方式讀取
-
關閉檔案
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;
}
執行結果(以下為按提示依次輸入 10、20、30……時的一次示例;型別大小或型別名可能隨編譯器和平臺變化):
姓名:张三
性别:男
年龄: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,其中寫入姓名為“張三”、年齡為 18 的 Person 物件。
總結:
- 檔案輸出流物件 可以通過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函式,以二進位制方式讀資料