程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放
通过文件可以将数据持久化
C++中对文件操作需要包含头文件 ==< fstream >==
文件类型分为两种:
- 文本文件 - 文件以文本的ASCII码形式存储在计算机中
- 二进制文件 - 文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们
操作文件的三大类:
- ofstream:写操作
- ifstream: 读操作
- fstream : 读写操作
5.1文本文件
5.1.1写文件
写文件步骤如下:
-
包含头文件
#include <fstream>
-
创建流对象
ofstream ofs;
-
打开文件
ofs.open("文件路径",打开方式);
-
写数据
ofs << "写入的数据";
-
关闭文件
ofs.close()
注意: 文件打开方式可以配合使用,利用|操作符
**例如:**用二进制方式写文件 ios::binary | ios:: out
1 #include <iostream> 2 #include <fstream>//头文件包含 3 using namespace std; 4 //文本文件写文件 5 void test01() 6 { 7 //1包含fstream头文件 8 //2.创建流对象 9 ofstream ofs;//起名无所谓 10 //3.指定打开的方式 11 ofs.open("test.txt", ios::out); 12 //4.写内容 13 ofs << "姓名:张三" << endl; 14 ofs << "性别:男" << endl; 15 ofs << "年龄:18" << endl; 16 //5.关闭文件 17 ofs.close(); 18 } 19 int main() 20 { 21 test01(); 22 }
总结:
- 文件操作必须包含头文件 fstream
- 读文件可以利用 ofstream ,或者fstream类
- 打开文件时候需要指定操作文件的路径,以及打开方式
- 利用<<可以向文件中写数据
- 操作完毕,要关闭文件
读文件
读文件与写文件步骤相似,但是读取方式相对于比较多
读文件步骤如下:
-
包含头文件
#include <fstream>
-
创建流对象
ifstream ifs;
-
打开文件并判断文件是否打开成功
ifs.open("文件路径",打开方式);
-
读数据
四种方式读取
-
关闭文件
ifs.close();
1 #include <iostream> 2 #include <fstream> 3 #include <string> 4 using namespace std; 5 void test01() 6 { 7 ifstream ifs; 8 //打开文件并判断是否打开成功 9 ifs.open("test.txt", ios::in); 10 if (!ifs.is_open()) 11 { 12 cout << "文件打开失败" << endl; 13 return; 14 } 15 //第一种方式 16 //为什么要初始化为0: 17 /* 18 读文件时设置数组大小, 19 一般会设置到一个很大的数超过需要读取的文件大小 20 这个用处就在这, 21 一是保证不会读到之前程序的遗留数据, 22 2是保证能够中止数组(一般不是用while去写入到数组里,保证能读完文件后读到0) 23 */ 24 char buf[999] = { 0 };//开辟一个string类型的数组,并将数组初始化全为0,大小为999(只要大于字符的大小即可但是不能使用系统 保留的那几个数)空间 25 while (ifs >> buf)//对ifs读数据,如果读不到了就返回1个假的值,因为数组初始化时全为0了 26 { 27 cout << buf << endl; 28 } 29 //第二种方式 30 //char buf[999] = { 0 }; 31 //while (ifs.getline(buf, sizeof(buf))) 32 //{ 33 // cout << buf << endl; 34 //} 35 //第三种 36 //string buf;//只能用string 不能用char 37 //while (getline(ifs, buf)) 38 //{ 39 // cout << buf << endl; 40 //} 41 //第四种 42 //char c; 43 //while ((c = ifs.get()) != EOF)//end of file 文件尾标志(不推荐,因为是一个个字符读效率低) 44 //{ 45 // cout << c ; 46 //} 47 ifs.close(); 48 } 49 int main() 50 { 51 test01(); 52 }
总结:
- 读文件可以利用 ifstream ,或者fstream类
- 利用is_open函数可以判断文件是否打开成功
- close 关闭文件
二进制文件
以二进制的方式对文件进行读写操作
打开方式要指定为 ==ios::binary==
5.2.1 写文件
二进制方式写文件主要利用流对象调用成员函数write
函数原型 :ostream& write(const char * buffer,int len);
参数解释:字符指针buffer指向内存中一段存储空间。len是读写的字节数
1 #include <iostream> 2 #include <fstream> 3 using namespace std; 4 //二进制文件(不仅能操作系统自定义的数据类型,还能操作自定义的数据类型) 写文件 5 class person 6 { 7 public: 8 char m_name[64]; 9 int m_age; 10 }; 11 void test01() 12 { 13 ofstream ofs("person.txt", ios::out | ios::binary);//也可以这样 14 //可以这样 ofs.open("person.txt",ios::out|ios::binary) 15 person p = { "张三",18 }; 16 ofs.write((const char*)&p, sizeof(person));//const 加字符类型表示强制转换成改类型 17 ofs.close(); 18 } 19 int main() 20 { 21 test01(); 22 }
ps : 预留空间在写文件时预留足,一旦创建了读文件.cpp,超过了写文件时预留的空间就会乱码,且创建了读文件.cpp后还不能去改写文件预留的空间,因为需要重新运行一次写文件.cpp才能更改,但是创建了读文件.cpp后就会只运行读文件.cpp了
总结:
- 文件输出流对象 可以通过write函数,以二进制方式写数据
读文件
二进制方式读文件主要利用流对象调用成员函数read
函数原型:istream& read(char *buffer,int len);
参数解释:字符指针buffer指向内存中一段存储空间。len是读写的字节数
1 #include <iostream> 2 #include <fstream> 3 using namespace std; 4 class person 5 { 6 public: 7 char m_name[64] = { 0 }; 8 int m_age; 9 }; 10 void test01() 11 { 12 fstream ifs; 13 ifs.open("person.txt", ios::in | ios::binary); 14 if (!ifs.is_open()) 15 { 16 cout << "打开文件失败" << endl; 17 return; 18 } 19 person p; 20 ifs.read((char*)&p, sizeof(person)); 21 cout << "name:" << p.m_name << endl 22 << "age :" << p.m_age << endl; 23 ifs.close(); 24 } 25 int main() 26 { 27 test01(); 28 }
- 文件输入流对象 可以通过read函数,以二进制方式读数据
标签:文件,ifs,ios,ofs,操作,include,open From: https://www.cnblogs.com/zaiyewujiang/p/16695032.html