程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放

通过文件可以将数据持久化

C++中对文件操作需要包含头文件 ==< fstream >==

文件类型分为两种:

  1. 文本文件 - 文件以文本的ASCII码形式存储在计算机中
  2. 二进制文件 - 文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们

操作文件的三大类:

  1. ofstream:写操作
  2. ifstream: 读操作
  3. fstream : 读写操作

5.1文本文件

5.1.1写文件

写文件步骤如下:

  1. 包含头文件

    #include <fstream>

  2. 创建流对象

    ofstream ofs;

  3. 打开文件

    ofs.open("文件路径",打开方式);

  4. 写数据

    ofs << "写入的数据";

  5. 关闭文件

    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类
  • 打开文件时候需要指定操作文件的路径,以及打开方式
  • 利用<<可以向文件中写数据
  • 操作完毕,要关闭文件

读文件

读文件与写文件步骤相似,但是读取方式相对于比较多

读文件步骤如下:

  1. 包含头文件

    #include <fstream>

  2. 创建流对象

    ifstream ifs;

  3. 打开文件并判断文件是否打开成功

    ifs.open("文件路径",打开方式);

  4. 读数据

    四种方式读取

  5. 关闭文件

    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函数,以二进制方式读数据

 

posted on 2022-09-18 17:24  在野武将  阅读(70)  评论(0)    收藏  举报