程序运行时产生的数据都属于临时数据,程序运行结束即被释放,但可以通过文件可以将数据持久化,C++通过类和对象实现对文件操作。
一、文件操作基础
文件可以分为两种类型,一是文本文件,文件以文本的ASCII码形式存储在计算机中;二是二进制文件,文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们。
C++中对文件操作需要包含头文件<fstream>且尽量不使用string存储字符串。
对文件的操作通过类和对象来完成,一般会用到三种类,ofstream写操作类、ifstream读操作类和fstream读写操作类。
无论是写文件还是读文件都需要先打开文件,打开方式一般有六种,可以单独使用,也可以通过“|”操作符配合使用。
二、文本文件
1.写文件
向文本文件中写入数据需要五个步骤:
包含头文件 #include<fstream>
创建流对象 ofstream ofs;
打开文件 ofs.open("文件路径",打开方式);
写数据 ofs << "写入的数据";
关闭文件 ofs.close();
//1、包含头文件
#include <fstream>
void test()
{
//2、创建流对象
ofstream ofs;
//3、打开文件
//若未标明test.txt的具体路径,编译器会默认路径为project.cpp所在文件夹下
//若路径下不存在test.txt,编译器会自动在project.cpp所在文件夹下创建test.txt
ofs.open("test.txt", ios::out);
//4、写数据
ofs << "姓名:丁真" << endl;
ofs << "宠物:纠纠小马" << endl;
ofs << "爱好:瑞克五" << endl;
//5、关闭文件
ofs.close();
}
int main()
{
test();
return 0;
}
2.读文件
读文件与写文件步骤相似,但打开文件后还需要利用函数is_open()判断文件是否打开成功,且读数据的方式比写数据要多。读取文本文件中的数据需要五个步骤:
包含头文件 #include<fstream>
创建流对象 ifstream ifs;
打开文件 ifs.open("文件路径",打开方式);
读数据 四种方式
关闭文件 ifs.close();
//1、包含头文件
#include <fstream>
void test()
{
//2、创建流对象
ifstream ifs;
//3、打开文件
//打开文件后还需要利用函数is_open()判断文件是否打开成功
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;
EOF:end of file
//while ((c = ifs.get()) != EOF)
//{
// cout << c;
//}
//5、关闭文件
ifs.close();
}
int main()
{
test();
return 0;
}
三、二进制文件
1.写文件
写文件的步骤和文本文件类似,区别如下:
打开文件时,打开方式必须要包含“ios::binary”;
写数据时,要利用流对象ofs调用成员函数write(),函数调用方式为“ostream& write(const char* buffer, int len);”,字符指针buffer指向写入数据的内存空间,len是该内存空间的字节数。
#include <fstream>
class Person
{
public:
char Animal[128];
char Hobby[128];
};
//1、包含头文件
void test()
{
Person DingZhen = { "宠物:纠纠小马", "爱好:瑞克五" };
//2、创建输出流对象
ofstream ofs;
//3、打开文件,打开方式必须要包含“ios::binary”
ofs.open("person.txt", ios::out | ios::binary);
//4、写数据
//要利用流对象ofs调用成员函数write(),函数调用方式为“ostream& write(const char* buffer, int len);”
//字符指针buffer指向写入数据的内存空间,len是该内存空间的字节数
ofs.write((const char*)&DingZhen, sizeof(DingZhen));
//5、关闭文件
ofs.close();
}
int main()
{
test();
return 0;
}
2.读文件
读文件的步骤和文本文件类似,区别如下:
打开文件时,打开方式必须要包含“ios::binary”;
读数据时,要利用流对象ifs调用成员函数read(),函数调用方式为“istream& read(char* buffer, int len);”,字符指针buffer指向用来存储读出数据的内存空间,len是该内存空间的字节数。
//1、包含头文件
#include <fstream>
class Person
{
public:
char Animal[128];
char Hobby[128];
};
void test()
{
Person DingZhen;
//2、创建输出流对象
ifstream ifs("person.txt", ios::in | ios::binary);
if (!ifs.is_open())
{
cout << "文件打开失败" << endl;
}
//4、读数据
//要利用流对象ifs调用成员函数read(),函数调用方式为“istream& read(char* buffer, int len);”
//字符指针buffer指向用来存储读出数据的内存空间,len是该内存空间的字节数
ifs.read((char*)&DingZhen, sizeof(DingZhen));
cout << DingZhen.Animal << endl;
cout << DingZhen.Hobby << endl;
//5、关闭文件
ifs.close();
}
int main()
{
test();
return 0;
}