【笔记】C++的文件操作

前言

C++的文件操作学习笔记

引入头文件

1
include <fstream>

文件操作的基本步骤

  1. 创建流对象
  2. 打开文件
  3. 读写数据
  4. 关闭文件

文本文件的读写

写文件

<src>:文件路径
文件的打开方式

ios::in:读文件
ios::out:写文件
ios::ate:初始位置文件尾部
ios::app:追加方式写文件
ios::trunc:覆盖方式写文件
ios::binary:二进制方式操作文件
<data>:需要写入的数据

1
2
3
4
5
6
7
8
// 创建流对象
ofstream ofs;
// 打开文件
ofs.open("<src>", ios::out);
// 写数据
ofs << <data>
// 关闭文件
ofs.close();

创建流对象时直接传递参数

1
2
3
4
5
6
// 创建流对象,并打开文件
ofstream ofs("<src>", ios::out);
// 写数据
ofs << <data>
// 关闭文件
ofs.close();

读文件

1
2
3
4
5
6
7
8
// 创建流对象
ifstream ifs;
// 打开文件
ifs.open("<src>", ios::in);
// 读数据
...
// 关闭文件
ofs.close();

创建流对象时直接传递参数

1
2
3
4
5
6
// 创建流对象,并打开文件
ifstream ifs("<src>", ios::in);
// 读数据
...
// 关闭文件
ofs.close();

读文件时读数据的方式

得到字符数组
  • 一组一组的读取
1
2
3
4
5
char buf[1024] = { 0 }
while (ifs >> buf)
{
cout << buf << endl;
}
得到字符数组
  • 将一组字符数组作为一行,一行一行的读取
1
2
3
4
5
char buf[1024] = { 0 }
while (ifs.getline(buf, sizeof(buf)))
{
cout << buf << endl;
}
得到字符串
  • 一行一行的读取
1
2
3
4
5
string buf;
while (getline(ifs, buf))
{
cout << buf << endl;
}
得到字符
  • 一个字符一个字符的读取,遇到文件结尾标识符时停止,每次得到的是字符
1
2
3
4
5
char c;
while ((c = ifs.get()) != EOF)
{
cout << buf << endl;
}

二进制文件的读写

写文件

<date>:需要写入的数据,不仅仅是字符串,也可以是对象

1
2
3
4
5
6
7
8
// 创建流对象
ofstream ofs;
// 打开文件
ofs.open("<src>", ios::out | ios::binary);
// 写数据
ofs.write(<data>, sizeof(<date>));
// 关闭文件
ofs.close();

创建流对象时直接传递参数

1
2
3
4
5
6
// 创建流对象
ofstream ofs("<src>", ios::out | ios::binary);
// 写数据
ofs.write(<data>, sizeof(<date>));
// 关闭文件
ofs.close();

读文件

(char *)&p:如果写入的数据是对象,那么读取的时候也可以读取到对象

1
2
3
4
5
6
7
8
9
// 创建流对象
ifstream ifs;
// 打开文件
ifs.open("<src>", ios::in | ios::binary);
// 写数据
Persion p;
ifs.write((char *)&p , sizeof(Persion));
// 关闭文件
ifs.close();

创建流对象时直接传递参数

1
2
3
4
5
6
7
// 创建流对象
ifstream ifs("<src>", ios::in | ios::binary);
// 写数据
Persion p;
ifs.write((char *)&p , sizeof(Persion));
// 关闭文件
ifs.close();

判断文件是否存在

1
2
3
4
5
6
7
8
ifstream ifs;
ifs.open("<src>", ios::in);

// 文件不存在
if (!ifs.is_open())
{
...
}

判断文件是否为空

1
2
3
4
5
6
7
8
9
10
ifstream ifs;
ifs.open("<src>", ios::in);

char ch;
ifs >> ch;
// 文件为空
if (ifs.eof())
{
...
}

清空文件内容

  • 利用覆盖写入实现清空文件内容
1
2
ofstream ofs;
ofs.open("<src>", trunc::in);

完成

参考文献

哔哩哔哩——黑马程序员