- 程序运行时的数据都属于临时数据,程序一旦运行结束都会被释放,通过文件操作可以将数据持久化
-
C++中对文件操作需要包含头文件
<fstream>
- 文件类型分为两种
- 文本文件 - ASCLL码形式存储
- 二进制文件 - 二进制形式存储
- 操作文件的三大类
- ofstream : 写操作
- ifstream : 读操作
- fstream : 读写操作
一、文本文件
1.1 写文件
- 包含头文件
#include<fstream>
- 创建流对象
ofstream ofs;
- 打开文件
ofs.open("path",打开方式);
- 写数据
ofs<<"写入的数据";
- 关闭文件
ofs.close()
- 包含头文件
- 文件打开方式
| 打开方式 | 解释 |
| :———: | :———–: |
| ios::in | 为读文件而打开文件 |
| ios::out | 为写文件而打开文件 |
| ios::ate | 初始位置:文件尾 |
| ios::app | 追加方式写文件 |
| ios::trunc | 如果文件存在先删除,再创建 |
| ios::binary | 二进制方式操作文件 |
注意:文件打开方式可以配合使用,使用 |
操作符
例如:用二进制方式写文件 ios::binary | ios::out
#include <iostream>
#include <fstream>
using namespace std;
void test() {
ofstream ofs;
ofs.open("testFile/test.txt", ios::out);
ofs << "张三" << endl;
ofs << "年龄:18" << endl;
ofs << "性别:男" << endl;
ofs.close();
cout << "Test over." << endl;
}
int main() {
test();
return 0;
}
1.2 读文件
- 包含头文件
#include<fstream>
- 创建流对象
ifstream ifs;
- 打开文件,并且判断是否读取成功
ifs.open("path",打开方式);
ifs.isopen();
- 读数据(多种方式)
- 全部读取
ifs >> buf
- 读取一行
ifs.getline(buf, sizeof(buf));
- 读取一行
getline(ifs, buf)); // buf为string
- 读取一个数据
(c = ifs.get()) != EOF // end of file
- 全部读取
- 关闭文件
ifs.close();
```Cpp #include#include // 1. 包含头文件 #include using namespace std;
void test() {
// 2. 创建流对象
ifstream ifs;
// 3. 打开对象并判断是否文件打开成功
ifs.open("testFile/test.txt", ios::in);
if (!ifs.is_open()) {
cout << "文件打开失败!" << endl;
return;
}
// 4. 读文件
// 第一种读取方式
// char buf[1024];
// while (ifs >> buf) {
// cout << buf << endl;
// }
// 第二种读取方式
// char buf2[1024];
// while (ifs.getline(buf2, sizeof(buf2))) {
// cout << buf2 << endl;
// }
// 第三种方式
string buf3;
while (getline(ifs, buf3)) {
cout << buf3 << endl;
}
// 第四种方式 不推荐 速度慢
// char c;
// while ((c = ifs.get()) != EOF) {
// cout << c;
// } }
int main() { test(); return 0; }
#### 二、二进制文件
##### 2.1 写文件
- 打开方式要指定为`ios::binary`
- 函数原型:`ostream &write(const char* buffer, int len);`
```Cpp
#include <iostream>
// 1. 包含头文件
#include <fstream>
using namespace std;
class Person {
public:
char m_Name[64];
int m_Age;
};
void test() {
Person p = {"张三", 18};
// 2. 创建流对象
ofstream ofs;
// 3. 打开文件
ofs.open("testFile/testBinary.txt", ios::binary | ios::out);
// 4. 写文件函数 ostream &write(const char* buffer, int len);
ofs.write((const char *)&p, sizeof(p));
// 5. 关闭文件
ofs.close();
}
int main() {
test();
return 0;
}
2.2 读文件
- 包含头文件
#include<fstream>
- 创建流对象
ifstream ifs;
- 打开文件,并且判断是否读取成功
ifs.open("path",ios::in | ios::binary);
ifs.isopen();
- 读数据(多种方式)
ifs.read((char *)&p, sizeof(p));
- 关闭文件
ifs.close();
```Cpp #include// 1. 包含头文件 #include using namespace std;
class Person { public: char m_Name[64]; int m_Age; };
void test() { // 2. 创建流对象 ifstream ifs; // 3. 打开文件 ifs.open(“testFile/testBinary.txt”, ios::binary | ios::in); // 4. 写文件函数 ostream &write(const char* buffer, int len); Person p; ifs.read((char *)&p, sizeof(Person)); cout « “姓名 : “ « p.m_Name « ” 年龄 : “ « p.m_Age « endl; // 5. 关闭文件 ifs.close(); }
int main() { test(); return 0; } ```
- 需要有相应的数据类型接收数据