c++文件操作

前言

前几天完成了一个oop小project,又是经典的自学环节(乐)。由于本人实在是太爱拖ddl,写代码过程中基本是随查随用,囫囵吞枣,因此交上去有时间了在此写个总结,理顺一下自己的思路,补充一下之前没学到的。

正文

c++关于文件操作及数据类型都定义在头文件fstream,命名空间std中,使用前记得调用。

数据结构

该头文件定义了三个数据类型

  1. ofstream:表示输出文件流,用于创建文件并向文件写入信息。
  2. ifstream:表示输入文件流,用于从文件中读取信息。
  3. fstream: 表示文件流,同时具有上述两种数据类型的功能。

这里我最开始有一个疑问,就是为什么fstream已经有了所有的功能,还要ofstream和ifstream。后来经过查询了解到stream的实现就是通过已经实现好的ofstream和ifstream。好吧,这很oop。但这也无法解释为什么要把ofstream和ifstream拿出来让用户调用。

后来联想到数据库和已经结课的信息安全原理课上的MAC(Mandatory Access Control,详情可见以后打算写的信息安全原理课程总结,先鸽着)。我们可以将其理解为不要给用户需求之外的权限,如果一个程序只需要读,就不要给它写入的权限,不然无论是从代码维护角度还是安全管理角度都存在问题,面向对象的思想也是尽可能的解耦合。而对于既需要读又需要写的程序,用ofstream和ifstream两个来回操作未免又过于麻烦,因此才会出现这样的三种数据结构。

函数

打开文件

1
void open(const char *filename, ios::openmode mode);
模式标记 适用对象 作用
ios::in ifstream,fstream 打开文件用于读取数据。如果文件不存在,则打开出错。
ios::out ofstream,fstream 打开文件用于写入数据。如果文件不存在,则新建该文件;如果文件原来就存在,则打开时清除原来的内容。
ios::app ofstream,fstream 打开文件,用于在其尾部添加数据。如果文件不存在,则新建该文件。
ios::ate ifstream 打开一个已有的文件,并将文件读指针指向文件末尾。如果文件不存在,则打开出错。
ios::tunc ofstream 打开文件时会清空内部存储的所有数据,单独使用时与 ios::out 相同。
ios::binary ifstream,ofstream,fstream 以二进制方式打开文件。若不指定此模式,则以文本模式打开。
ios::noreplace ifstream,ofstream,fstream 以独家方式打开文件,即锁定任何其他进程对文件的访问。

tips:

  • noreplace关键词在c++23标准后才可使用。
  • 当不指定模式时,fstream默认为ios::in|ios::out,ifstream默认为ios::in,ofstream默认为ios::out。
  • 部分资料查到open函数还有一个prot参数,但该参数使用不多,且在cppreference.com并未找到说明,因此在本篇文章中略过不谈。
  • 模式可以组合使用,使用 | 连起来即可。

关于二进制方式打开文件具体细节请见【文本打开和二进制打开文件的区别

未完待续……

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2023 J-sycamore