前面学习了多态,现在我们开始学习一些C++的武器,也就是一些常用的类库。程序在运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放。通过文件可以将数据持久化,也就是把数据写入文件,叫序列化,程序读取文件,显示出各种数据。这个过程叫反序列化。这篇开始我们来学习下C++如何读写文件。
1.文件分文本文件和二进制文件
1)文本文件,文件以文本的ASCII码形式存储在计算机中
2)二进制文件,文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们。(都是01这样的数据)
2.C++操作文件的三大类
1.ofstream:写操作,outputStream
2.ifstream: 读操作 inputStream, f表示file
3.fstream: 读写操作
3.写文本文件的5个步骤
1)包含头文件
#include <fstream>
2) 创建流对象
ofstream ofs;
3) 打开文件
ofs.open("文件路径", 打开方式);
4)写数据
ofs << "写入数据";
5)关闭文件流
ofs.close();
下面这个表格,统计了各种打开方式
上面的打开方式可以结合一起使用,例如 ios::ate | ios::binary
使用管道符连接多个打开方式。
下面来写一个写文本文件的代码,例如就test.txt吧
#include <iostream>
#include <fstream>
using namespace std;
void test01()
{
//2.创建流对象
ofstream ofs;
//3.打开流文件
ofs.open("test.txt", ios::ate | ios::out);
//4.写入文件
ofs << "这是写入文件练习";
//5.关闭流对象
ofs.close();
}
int main()
{
test01();
system("pause");
return 0;
}
运行结果
4.读文本文件
读文件的步骤如下
1.包含头文件
#include <fstream>
2.创建流对象
ifstream ifs;
3.打开文件并判断文件是否打开成功
ifs.open("文件路径", 打开方式);
4.读数据
四种方式读取
5. 关闭文件
ifs.close()
这次我们要读文件的内容如下
相关代码
#include <iostream>
#include <fstream>
using namespace std;
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;
}
//5.关闭流对象
ifs.close();
}
int main()
{
test01();
system("pause");
return 0;
}
运行结果
上面介绍了第一种读文件,大致原理是,先初始化一个大小为1024的字节数组,然后读取一行就存入buf字节数组。
再来看看其他三种读文件的方法(剩下代码都相同)
//4.读文件,第二种方法
char buf[1024] = {0};
while (ifs.getline(buf, 1024))
{
cout << buf << endl;
}
第三种,使用字符串方法
//4.读文件,第三种方法
string buf;
while (getline(ifs, buf))
{
cout << buf << endl;
}
第四种
//4. 读文件,第四种,不推荐
char c;
while ( (c = ifs.get()) != EOF) // EOF: end of file
{
cout << c;
}
第四种,这里不推荐,效率很慢。原理是一次只读取一个字符,存到c,然后判断是否读到文件结束位置,EOF就是一个标记位置。这里读取一个字符,打印出一个字符,其中换行也是一个字符。