18-文件操作
18.1 文本文件
程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放
通过 文件可以将数据持久化
C++ 中堆文件操作需要包含头文件 <fstream>
文件类型分为两种:
-
文本文件:文件以文本的 ASCII码 形式存储在计算机中 -
二进制文件:文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们
操作文件的三大类:
-
ofstream:写操作 -
ifstream:读操作 -
fstream:读写操作
18.1.1 写文件
写文件步骤:
-
包含头文件
include <fstream> -
创建流对象
ofstream ofs -
打开文件
ofs.open("文件路径",“打开方式”); -
写数据
ofs << “写入的数据” -
关闭文件
ofs.close();
文件打开方式:
| 打开方式 | 解释 |
|---|---|
| ios::in | 为读文件而打开文件 |
| ios::out | 为写文件而打开文件 |
| ios::ate | 初始位置:文件尾 |
| ios::app | 追加方式写文件 |
| ios::trunc | 如果文件存在先删除,再创建 |
| ios::binary | 二进制方式 |
示例
x
using namespace std;
//1、导入头文件
int main() {
//2、创建流对象
ofstream ofs;
//3、打开文件
ofs.open("test.txt",ios::out);
//4、输出内容
ofs << "姓名:小马" << endl;
ofs << "年龄:18" << endl;
ofs << "性别:女" << endl;
//5、关闭文件
ofs.close();
system("pause");
return 0;
}
运行

在项目目录中找到写入的文件


默认目录为当前项目的运行目录
总结:
-
文件操作必须包含头文件
fstream -
读文件可以利用
ofstream、或者fstream -
打开文件时候需要指定操作文件的路径,以及打开方式
-
利用
<<可以向文件中写数据 -
操作完毕,要关闭文件
18.1.2 读文件
读文件与写文件步骤相似,但是读取方式相对于比较多
读文件步骤如下:
-
包含头文件
#include <fstream> -
创建流对象
ifstream ifs; -
打开文件并判断文件是否打开成功
ifs.open("文件路径","打开方式"); -
读数据
四种读取方式
-
关闭文件
ifs.close();
示例
xxxxxxxxxx
using namespace std;
//1、添加头文件
void test01() {
cout << "test01 函数执行" << endl;
ifstream ifs;
ifs.open("test01.txt", ios::in);
if (! ifs.is_open())
{
cout << "文件打开失败" << endl;
cout << endl;
return;
}
cout << "文件打开成功" << endl;
}
void test02() {
cout << "test02 函数执行" << endl;
//2、创建流对象
ifstream ifs;
//3、打开文件,并且判断文件是否打开成功
ifs.open("test.txt", ios::in);
//判断文件是否打开成功
if (! ifs.is_open())
{
cout << "文件打开失败" << endl;
return;
}
//创建一个字符数组,存储读取到的数据
char buf[1024] = { 0 };
//第一种读取方式
cout << "第一种读取方式" << endl;
while (ifs >> buf)
{
// ifs >> buf 的方式按照 空白字符 读取
// 例如 换行符、空格、制表符等
// ifs >> buf 的方式读取的内容不包含 空白字符
cout << buf << endl;
}
cout << endl;
//重置 ifs 的状态
ifs.clear();
ifs.seekg(0);
//第二种读取方式
cout << "第二种读取方式" << endl;
while (ifs.getline(buf,sizeof(buf)))
// getline 需要传入 2 个参数,分别用于存储读取的数据,和限定存储读取数据的长度
// 如果读取的数据超过存储的长度,则会将超出部分暂时存放在 Ifs 流对象的内存中,等待下次读取
{
// ifs.getline 的方式按照 换行符 读取
// 该读取方式读取的内容不包含 换行符
cout << buf << endl;
}
cout << endl;
//重置 ifs 的状态
ifs.clear();
ifs.seekg(0);
//第三种读取方式
cout << "第三种读取方式" << endl;
// 声明一个 string 变量
string bufStr;
//动态调节 bufStr 的大小
//不会受到缓冲区大小限制
//不需要手动处理字符串和内存
//但是比 char 方式占用的内存更多
while ( getline(ifs,bufStr))
{
cout << bufStr << endl;
}
cout << endl;
//重置 ifs 的状态
ifs.clear();
ifs.seekg(0);
//第四种读取方式
cout << "第四种读取方式" << endl;
//声明 字符 类型变量 c
char c;
while ((c = ifs.get()) != EOF)
//该方式每次只读一个字符
//EOF 释义未 End of File 是否读取到文件尾
{
cout << c;
//该方式读取效率低,不推荐使用
}
//关闭文件
ifs.close();
}
int main() {
test01();
test02();
system("pause");
return 0;
}
运行

总结:
-
读文件可以利用
ifstream,或者fstream类 -
利用
if_open函数可以判断文件是否打开成功 -
close关闭文件
18.2 二进制文件
以二进制的方式对文件进行读写操作
打开方式要指定为 ios::binary
18.2.1 写文件
二进制方式写文件主要利用流对象调用成员函数 write
函数原型:ostream& write(const char * buffer,int len);
参数解释:字符指针 buffer 指向内存中一段存储空间,len 是读写的字节数
示例
x
using namespace std;
// 1、添加头文件
class Person {
public:
char name[64];
int age;
};
void test01(){
//创建 Person 对象
Person p1 = { "小宋" , 18 };
//2、创建流对象
ofstream ofs;
//3、打开文件
ofs.open("testBin.txt", ios::out | ios::binary);
//4、写入数据
ofs.write((const char*)&p1, sizeof(Person));
//5、关闭文件
ofs.close();
}
int main() {
test01();
system("pause");
return 0;
}
运行


18.2.2 读文件
二进制方式读文件主要利用流对象调用成员函数 read
函数原型:istream& read(char *buffer, int len);
参数解释:字符指针 buffer 指向内存中一段存储空间,len 是读写的字节数
示例
xxxxxxxxxx
using namespace std;
// 1、添加头文件
class Person {
public:
char name[64];
int age;
};
// 声明 Person 类
void test01() {
// 2、创建流对象
ifstream ifs;
// 3、打开文件
ifs.open("testBin.txt",ios::in | ios::binary);
// 4、判断是否打开
if ( !ifs.is_open())
{
cout << "文件打开失败" << endl;
return;
}
// 5、将读取的数据导入 Person
//创建一个用来存储数据的 Person 对象 p1
Person p1;
ifs.read((char*)&p1, sizeof(Person));
cout << "姓名:" << p1.name << endl;
cout << "年龄:" << p1.age << endl;
// 6、关闭文件
ifs.close();
}
int main() {
test01();
system("pause");
return 0;
}
运行

-
文件输入流对象 可以通过
read函数,以二进制方式读数据