• 第十九章 文件操作


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

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

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

    文件类型分为两种:

    1. 文本文件 - 文件以文本的ASCII码形式存储在计算机中

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

    操作文件的三大类:

    1. ofstream:写操作

    2. ifstream: 读操作

    3. fstream : 读写操作

    一、文本文件

    1、写文件

    写文件步骤如下:

    1. 包含头文件

      #include

    2. 创建流对象

      ofstream ofs;

    3. 打开文件

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

    4. 写数据

      ofs << "写入的数据";

    5. 关闭文件

      ofs.close();

    文件打开方式:

    打开方式解释
    ios::in为读文件而打开文件
    ios::out为写文件而打开文件
    ios::ate初始位置:文件尾
    ios::app追加方式写文件
    ios::trunc如果文件存在先删除,再创建
    ios::binary二进制方式

    注意: 文件打开方式可以配合使用,利用|操作符

    例如:用二进制方式写文件 ios::binary | ios:: out

    示例:

    1.  #include
    2.  ​
    3.  void test01()
    4.  {
    5.   ofstream ofs;
    6.   ofs.open("test.txt", ios::out);
    7.  ​
    8.   ofs << "姓名:张三" << endl;
    9.   ofs << "性别:男" << endl;
    10.   ofs << "年龄:18" << endl;
    11.  ​
    12.   ofs.close();
    13.  }
    14.  ​
    15.  int main() {
    16.  ​
    17.   test01();
    18.  ​
    19.   system("pause");
    20.  ​
    21.   return 0;
    22.  }

    总结:

    • 文件操作必须包含头文件 fstream

    • 读文件可以利用 ifstream ,或者fstream类

    • 打开文件时候需要指定操作文件的路径,以及打开方式

    • 利用<<可以向文件中写数据

    • 操作完毕,要关闭文件

    2、读文件

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

    读文件步骤如下:

    1. 包含头文件

      #include

    2. 创建流对象

      ifstream ifs;

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

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

    4. 读数据

      四种方式读取

    5. 关闭文件

      ifs.close();

    示例:

    1.  #include
    2.  #include
    3.  void test01()
    4.  {
    5.   ifstream ifs;
    6.   ifs.open("test.txt", ios::in);
    7.  ​
    8.   if (!ifs.is_open())
    9.   {
    10.   cout << "文件打开失败" << endl;
    11.   return;
    12.   }
    13.  ​
    14.   //第一种方式
    15.      //对于ifs>>buf流输入方式存取,其原则是当碰见空格之后,就结束当前读取,
    16. //这时在while条件中默认返回布尔值true,然后去执行while下面的语句
    17. //所以想要读取完文本内容,就必须借助while,
    18. //当没有字符读入时结束文本读取,即读到了文件尾部EOF,此时在while条件中默认返回布尔值false。
    19. //ifs >> xx 返回的是ifs本身(显式返回ifs本身),故可以链式编程,即ifs >> xx >> yy >> zz;
    20. //ifs >> xx 在while条件中会隐式转换成布尔值(隐式返回布尔值),
    21. //读取成功返回true,读取失败或结束返回false 
    22. //char buf[1024] = { 0 };
    23.   //while (ifs >> buf)
    24.   //{
    25.   // cout << buf << endl;
    26.   //}
    27.  ​
    28.   //第二种
    29.      //对于ifs.getline读取方法,和getline全局函数类似。也是按行读取,并且当遇到‘\n’之后,结束当前行读取。直到没有数据读取就结束当前文本读取。(注:读取的时候也会将空格读入数组,在提取数据的时候,就需要指定关键信息存取)
    30.   //char buf[1024] = { 0 };
    31.   //while (ifs.getline(buf,sizeof(buf)))
    32.   //{
    33.   // cout << buf << endl;
    34.   //}
    35.  ​
    36.   //第三种
    37.      //对于全局函数getline的用法,由于该函数默认是一行一行的读取,所以需要while循环来读取txt文本的所以内容,当遇到‘\n’,标志读取该行结束。当读取不到任何字符的时候就返回false,可用于判断文件是否结束
    38.   //string buf;
    39.   //while (getline(ifs, buf))
    40.   //{
    41.   // cout << buf << endl;
    42.   //}
    43.  ​
    44.      //第四种:一次读取一个字符
    45.   char c;
    46.   while ((c = ifs.get()) != EOF)
    47.   {
    48.   cout << c;
    49.   }
    50.  ​
    51.   ifs.close();
    52.  ​
    53.  ​
    54.  }
    55.  ​
    56.  int main() {
    57.  ​
    58.   test01();
    59.  ​
    60.   system("pause");
    61.  ​
    62.   return 0;
    63.  }

    总结:

    • 读文件可以利用 ifstream ,或者fstream类

    • 利用is_open函数可以判断文件是否打开成功

    • close 关闭文件

    二、二进制文件

    以二进制的方式对文件进行读写操作

    打开方式要指定为 ios::binary

    1、写文件

    二进制方式写文件主要利用流对象调用成员函数write

    函数原型 :ostream& write(const char * buffer,int len);

    参数解释:字符指针buffer指向内存中一段存储空间。len是读写的字节数

    示例:

    1.  #include
    2.  #include
    3.  ​
    4.  class Person
    5.  {
    6.  public:
    7.   char m_Name[64];
    8.   int m_Age;
    9.  };
    10.  ​
    11.  //二进制文件 写文件
    12.  void test01()
    13.  {
    14.   //1、包含头文件
    15.  ​
    16.   //2、创建输出流对象
    17.   ofstream ofs("person.txt", ios::out | ios::binary);
    18.  
    19.   //3、打开文件
    20.   //ofs.open("person.txt", ios::out | ios::binary);
    21.  ​
    22.   Person p = {"张三" , 18};
    23.  ​
    24.   //4、写文件
    25.   ofs.write((const char *)&p, sizeof(p));
    26.  ​
    27.   //5、关闭文件
    28.   ofs.close();
    29.  }
    30.  ​
    31.  int main() {
    32.  ​
    33.   test01();
    34.  ​
    35.   system("pause");
    36.  ​
    37.   return 0;
    38.  }

    总结:

    • 文件输出流对象 可以通过write函数,以二进制方式写数据

    2、读文件

    二进制方式读文件主要利用流对象调用成员函数read

    函数原型:istream& read(char *buffer,int len);

    参数解释:字符指针buffer指向内存中一段存储空间。len是读写的字节数

    示例:

    1.  #include
    2.  #include
    3.  ​
    4.  class Person
    5.  {
    6.  public:
    7.   char m_Name[64];
    8.   int m_Age;
    9.  };
    10.  ​
    11.  void test01()
    12.  {
    13.   ifstream ifs("person.txt", ios::in | ios::binary);
    14.   if (!ifs.is_open())
    15.   {
    16.   cout << "文件打开失败" << endl;
    17.   }
    18.  ​
    19.   Person p;
    20.   ifs.read((char *)&p, sizeof(p));
    21.  ​
    22.   cout << "姓名: " << p.m_Name << " 年龄: " << p.m_Age << endl;
    23.  }
    24.  ​
    25.  int main() {
    26.  ​
    27.   test01();
    28.  ​
    29.   system("pause");
    30.  ​
    31.   return 0;
    32.  }

    • 文件输入流对象 可以通过read函数,以二进制方式读数据

  • 相关阅读:
    pip安装或更新
    Python数据结构——Tuple
    Grander因果检验(格兰杰)原理+操作+解释
    【Linux 25】网络套接字 socket 概念
    【机器学习】034_多层感知机Part.2_从零实现多层感知机
    【S1005基于bs架构的自行车在线租赁管理系统-哔哩哔哩】 https://b23.tv/WJJFGAh
    【MySQL | 进阶篇】06、全局锁、表级锁、行级锁
    PHP7.X 版本新特性摘选
    微信支付——微信退款实战教程(Java版)
    C++-Cmake指令:find_library【该命令用于查找库(动态库或者静态库),当构建依赖于第三方库/系统库,可以使用该命令来查找并使用库】
  • 原文地址:https://blog.csdn.net/qq_26126363/article/details/133918241