视频链接
通过文件可以将数据持久化
C++中对文件操作需要包含头文件 < fstream >
包含头文件
#include
创建流对象
ofstream ofs;
打开文件
ofs.open(“文件路径”,打开方式);
文件路径可以直接写个文件名,因为如果不指定路径的话,他会默认在当前项目路径下。
写数据
ofs << “写入的数据”;
类似于cout<<“…”; cout就是往屏幕上输出,而ofs就是往文件里输出
关闭文件,这一步很重要而且容易遗漏
ofs.close();
#include
using namespace std;
#include
// 1.包含头文件 fstream
#include
// 文本文件 写文件
void test01() {
// 1.包含头文件
// 2.创建流对象
ofstream ofs;
// 3.指定打开的方式
//文件名为test.txt
ofs.open("test.txt", ios::out);
// 4.写内容
ofs << "姓名:张三" << endl << "年龄:19" << endl << "性别:男" << endl;
// 5.关闭文件
ofs.close();
}
int main() {
test01();
cin.get();
return 0;
}
总结:
读文件与写文件步骤相似,但是读取方式相对于比较多
读文件步骤如下:
包含头文件
#include
创建流对象
ifstream ifs;
打开文件并判断文件是否打开成功
ifs.open(“文件路径”,打开方式);
读数据
四种方式读取
关闭文件,记住别忘了要关闭文件
ifs.close();
判断文件是否打开成功(其实也就是判断有没有这个文件):
if (!ifs.is_open())
{
cout << "文件打开失败" << endl;
return;
}
if_open()是系统自带的布尔类型函数,打开成功返回1
打开失败返回0(这个函数是判断文件是否存在的)
//第一种方式
char buf[1024] = { 0 };//首先初始化字符数组
while (ifs >> buf)
// ifs右移运算符,他会读取数据并放到buf数组中,当数据全部读完后,返回一个false,while循环也就结束了
{
cout << buf << endl;
}
char *str:表示我们要把读取的数据放到哪个地方,一般是个数组
count:所占的空间
//第二种
char buf[1024] = { 0 };
while (ifs.getline(buf,sizeof(buf)))
{
cout << buf << endl;
}
//第三种
string buf;
while (getline(ifs, buf))
{
cout << buf << endl;
}
ifs.get()每次只读一个字符。EOF代表末尾的意思
// 第四种
char c;
while ((c = ifs.get()) != EOF)
{
cout << c;
}
#include
using namespace std;
//1. 包含头文件
#include
#include
void test01()
{ // 2. 创建流对象
ifstream ifs;
//3. 打开文件并判断文件是否打开成功
ifs.open("test.txt", ios::in);
if (!ifs.is_open())
{
cout << "文件打开失败" << endl;
return;
}
// 4. 读数据
// 四种方式
//第一种方式
//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;
//}
// 5. 关闭文件
ifs.close();
}
int main() {
test01();
system("pause");
return 0;
}
以二进制的方式对文件进行读写操作
二进制方式写文件主要利用流对象调用成员函数write
函数原型 :ostream& write(const char * buffer,int len);
参数解释:参数一:字符指针常量buffer(也可以理解为就是一段地址(指针就是地址),不过要把它强制转换成const char * ) 。 buffer指向内存中一段存储空间。len是读写的字节数
数组名就可以直接作为参数一,当传数组给一个函数时,数组类型自动转换为指针类型,传的实际是数组元素首地址。
建议看的文章1:将地址强制转换为指针
建议看的文章2指针的强制类型转换
#include
using namespace std;
#include
#include
class Person
{
public:
char m_Name[64];
int m_Age;
};
//二进制文件 写文件
void test01()
{
//1、包含头文件
//2、创建输出流对象
ofstream ofs("person.txt", ios::out | ios::binary|ios::trunc);
//3、打开文件
//ofs.open("person.txt", ios::out | ios::binary);
int a = 55;
int d[20];
for (int i = 0; i < 20; i++) {
d[i] = i;
}
Person p = { "张三" , 18 };
char c[15] = { "Hello,World!" };
//4、写文件
ofs.write((const char*)&a, sizeof(a));
ofs.write((const char*)d, sizeof(c));
ofs.write((const char*)&p, sizeof(p));
ofs.write((const char*)c, sizeof(c));
//5、关闭文件
ofs.close();
}
int main() {
test01();
system("pause");
return 0;
}
二进制方式读文件主要利用流对象调用成员函数read
函数原型:istream& read(char *buffer,int len);
参数解释:参数一:字符指针buffer(也可以理解为就是一段地址(指针就是地址),不过要把它强制转换成 char * ) 。它指向内存中一段存储空间。len是读写的字节数
数组名可以直接作为参数一,当传数组给一个函数时,数组类型自动转换为指针类型,传的实际是数组元素首地址。
#include
using namespace std;
// 1.包含头文件
#include
#include
class Person
{
public:
char m_Name[64];
int m_Age;
};
void test01()
{
// 2.创建流对象的同时打开文件
ifstream ifs("person.txt", ios::in | ios::binary);
// 3.判断文件是否打开成功
if (!ifs.is_open())
{
cout << "文件打开失败" << endl;
}
Person p;
// 4.将二进制数据转换为可读数据
// 这一步不能将数据读出到屏幕上,这一步的作用只是把二进制数据转换为可读数据
int d;
int z[20];
char c[15];
ifs.read((char*)&d, sizeof(d));
ifs.read((char*)z, sizeof(z));
ifs.read((char*)&p, sizeof(p));
ifs.read((char*)c, sizeof(c));
// 5.打印转换后的可读数据
// 用cout即可读出数据
cout << "d=" << d << endl;
cout << "姓名: " << p.m_Name << " 年龄: " << p.m_Age << endl;
for (int i = 0; i < 20; i++) {
cout << z[i] << endl;
}
for (int i = 0; i < 15; i++) {
cout << c[i];
}
cout << endl;
// 6.关闭文件
ifs.close();
}
int main() {
test01();
system("pause");
return 0;
}
比如用write函数写入一个整形数组:
int c[20];
ofs.write((const char*)&c, sizeof(c));
那么read函数接受时也应用整形数组来接受:
int z[20];
ifs.read((char*)z, sizeof(z));
比如按下列顺序用write函数写入了以下四个数据类型:
int a = 55;
int d[20];
Person p = { "张三" , 18 };
char c[15] = { "Hello,World!" };
//4、按下列顺序写入文件
ofs.write((const char*)&a, sizeof(a));
ofs.write((const char*)d, sizeof(c));
ofs.write((const char*)&p, sizeof(p));
ofs.write((const char*)c, sizeof(c));
read函数查看时也得与写入时的顺序相同:
int d;
int z[20];
char c1[15];
Person p1;
// 注意各个read函数的顺序
ifs.read((char*)&d, sizeof(d));
ifs.read((char*)z, sizeof(z));
ifs.read((char*)&p1, sizeof(p1));
ifs.read((char*)c1, sizeof(c1));
不能写成下面这样:
int d;
int z[20];
char c1[15];
Person p1;
ifs.read((char*)&d, sizeof(d));
ifs.read((char*)c1, sizeof(c1));
ifs.read((char*)z, sizeof(z));
ifs.read((char*)&p1, sizeof(p1));