在程序中,要使用一个文件,先要打开文件后才能读写,读写完后要关闭。创建一个新文件也要先执行打开(open)操作,然后才能往文件中写入数据。C++ 文件流类有相应的成员函数来实现打开、读、写、关闭等文件操作。

C++ 标准类库中有三个类可以用于文件操作,它们统称为文件流类。这三个类是:

  • ifstream:用于从文件中读取数据。
  • ofstream:用于向文件中写人数据。
  • fstream:既可用于从文件中读取数据,又可用于 向文件中写人数据。

使用这三个类时,程序中需要包含 fstream 头文件。 C++ 类库中的流类如下图所示。

ifstream 类和 fstream 类是从 istream 类派生而来的,因此 ifstream 类拥有 istream 类的全部成员函数。同样地,ofstream 和 fstream 类也拥有 ostream 类的全部成员函数。这三个类中有一些十分熟悉的成员函数可以使用,如operator <<、 operator >>、peek、ignore、getline、get 等。

----对文件操作

在对文件进行读写操作之前,先要打开文件。打开文件有以下两个目的:

  • 通过指定文件名,建立起文件和文件流对象的关联,以后要对文件进行操作时,就可以通过与之关联的流对象来进行。
  • 指明文件的使用方式。使用方式有只读、只写、既读又写、在文件末尾添加数据、以文本方式使用、以二进制方式使用等多种。

打开文件可以通过以下两种方式进行:

  • 调用流对象的 open 成员函数打开文件。
  • 定义文件流对象时,通过构造函数打开文件。

关闭文件时,调用文件流对象的 close 成员函数即可

------1.使用 open 函数打开文件

先看第一种文件打开方式。以 ifstream 类为例,该类有一个 open 成员函数,其他两个文件流类也有同样的 open 成员函数:

void open(const char* szFileName, int mode)

第一个参数是指向文件名的指针,第二个参数是文件的打开模式标记。

文件的打开模式标记代表了文件的使用方式,这些标记可以单独使用,也可以组合使用。如下列出了各种模式标记单独使用时的作用,以及常见的两种模式标记组合的作用。

文件打开模式标记
模式标记 适用对象 作用
ios::in ifstream
fstream
打开文件用于读取数据。如果文件不存在,则打开出错。
ios::out ofstream
fstream
打开文件用于写入数据。如果文件不存在,则新建该文件;如 果文件原来就存在,则打开时清除原来的内容。
ios::app ofstream
fstream
打开文件,用于在其尾部添加数据。如果文件不存在,则新建该文件。
ios::ate ifstream 打开一个已有的文件,并将文件读指针指向文件末尾(读写指 的概念后面解释)。如果文件不存在,则打开出错。
ios:: trunc ofstream 单独使用时与 ios:: out 相同。
ios::binary ifstream
ofstream
fstream
以二进制方式打开文件。若不指定此模式,则以文本模式打开。
ios::in | ios::out fstream 打开已存在的文件,既可读取其内容,也可向其写入数据。文件刚打开时,原有内容保持不变。如果文件不存在,则打开出错。
ios::in | ios::out ofstream 打开已存在的文件,可以向其写入数据。文件刚打开时,原有内容保持不变。如果文件不存在,则打开出错。
ios::in | ios::out | ios::trunc fstream 打开文件,既可读取其内容,也可向其写入数据。如果文件本来就存在,则打开时清除原来的内容;如果文件不存在,则新建该文件。

ios::binary 可以和其他模式标记组合使用,例如:

  • ios::in | ios::binary表示用二进制模式,以读取的方式打开文件。
  • ios::out | ios::binary表示用二进制模式,以写入的方式打开文件。

文本方式与二进制方式打开文件的区别其实非常微小,

一般来说,如果处理的是文本文件,那么用文本方式打开会方便一些。但其实任何文件都可以以二进制方式打开来读写。

在流对象上执行 open 成员函数,给出文件名和打开模式,就可以打开文件。判断文件打开是否成功,可以看“对象名”这个表达式的值是否为 true,如果为 true,则表示文件打开成功。

//打开文件
#include <iostream>
#include <fstream>
using namespace std;
int main()
{ifstream inFile;          //流类ifstream 建立读取数据的文件流对象inFile.open("c:\\tmp\\test.txt", ios::in);   //调用流对象的 open 成员函数打开准备读取的
//文件。参数是文件名和打开模式                   if (inFile)  //判断流对象名的表达式,若果为真true,条件成立,则说明文件打开成功inFile.close();   //关闭文件时,调用文件流对象的 close 成员函数即可。 elsecout << "test.txt doesn't exist" << endl;ofstream oFile;       //流类ofstream  建立写入数据的文件流对象oFile.open("test1.txt", ios::out);      //调用流对象的 open 成员函数打开准备写入数据的文
//件。参数是文件名和打开模式                   if (!oFile)  //判断流对象名的表达式,条件成立(PS:注意此处是!非),则说明文件打开出错cout << "error 1" << endl;elseoFile.close();  //关闭文件时,调用文件流对象的 close 成员函数即可。oFile.open("tmp\\test2.txt", ios::out | ios::in);  //第二个参数打开模式是  打开已存在的
//文件,既可读取其内容,也可向其写入数据。文件刚打开时,原有内容保持不变。如果文件不存在,则打开
//出错。if (oFile)  //条件成立,则说明文件打开成功oFile.close();elsecout << "error 2" << endl;fstream ioFile;    //流类fstreamioFile.open("..\\test3.txt", ios::out | ios::in | ios::trunc);//第二参数打开模式是   打
//开文件,既可读取其内容,也可向其写入数据。如果文件本来就存在,则打开时清除原来的内容;如果文件
//不存在,则新建该文件。if (!ioFile)cout << "error 3" << endl;elseioFile.close();return 0;
}

调用 open 成员函数时,给出的文件名可以是全路径的,如第 7 行的c:\\tmp\\test.txt, 指明文件在 c 盘的 tmp 文件夹中;也可以只给出文件名,如第 13 行的test1.txt,这种情况下程序会在当前文件夹(也就是可执行程序所在的文件夹)中寻找要打开的文件。
第 18 行的tmp\\test2.txt给出的是相对路径,说明 test2.txt 位于当前文件夹的 tmp 子文件夹中。第 24 行的..\\test3.txt也是相对路径,代表上一层文件夹,此时要到当前文件夹的上一层文件夹中查找 test3.txt。此外,..\\..\\test4.txt..\\tmp\\test4.txt等都是合法的带相对路径的文件名。

-----2.使用流类的构造函数打开文件     (PS:不要忘记什么是构造函数啊!!!在C++中,有一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户显式调用(用户也不能调用),而是在创建对象时自动执行。这种特殊的成员函数就是构造函数(Constructor)。)

定义流对象时,在构造函数中给出文件名和打开模式也可以打开文件。以 ifstream 类(PS不要忘记它的本质是一个类哦)为例,它有如下构造函数:

ifstream::ifstream (const char* szFileName, int mode = ios::in, int);

第一个参数是指向文件名的指针;第二个参数是打开文件的模式标记,默认值为ios::in; 第三个参数是整型的,也有默认值,一般极少使用。

在定义流对象时打开文件的示例程序如下(用流类的构造函数打开文件):

#include <iostream>
#include <fstream>
using namespace std;
int main()
{ifstream inFile("c:\\tmp\\test.txt", ios::in);  //流ifstream 直接使用定义流对象打开要读取数据的文
//件,不要流对象的类下的open()成员函数if (inFile)inFile.close();elsecout << "test.txt doesn't exist" << endl;ofstream oFile("test1.txt", ios::out); //流ofstream 直接使用定义流对象打开要写入数据的文件,不要流对
//象的类下的open()成员函数if (!oFile)cout << "error 1";elseoFile.close();fstream oFile2("tmp\\test2.txt", ios::out | ios::in);   //流fstream同上 此文件即可写入也可读取if (!oFile2)cout << "error 2";elseoFile.close();return 0;
}

c++:文件操作1 文件的打开相关推荐

  1. python关闭读写的所有的文件-Python文件操作:文件的打开关闭读取写入

    Python文件操作:文件的打开关闭读取写入 一.文件的打开关闭 Python能以文本和二进制两种方式处理文件,本文主要讨论在Python3中文本文件的操作. 文件操作都分为以下几个步骤: 1.打开文 ...

  2. python以写模式打开的文件无法进读操作_Python文件操作:文件的打开关闭读取写入...

    Python文件操作:文件的打开关闭读取写入 一.文件的打开关闭 Python能以文本和二进制两种方式处理文件,本文主要讨论在Python3中文本文件的操作. 文件操作都分为以下几个步骤: 1.打开文 ...

  3. QT-功能-实现文件操作一系列功能(打开,写入,更改,删除)

    用qt的QFile类实现一系列对文件的简单操作 1.打开文件 代码实现 效果展示 2.写入文件 代码实现 效果展示 3.文件修改 代码实现 效果展示 4.删除文件 代码实现 效果展示 此系列展示均为创 ...

  4. C++ 学习笔记之——文件操作和文件流

    1. 文件的概念 对于用户来说,常用到的文件有两大类:程序文件和数据文件.而根据文件中数据的组织方式,则可以将文件分为 ASCII 文件和二进制文件. ASCII 文件,又称字符文件或者文本文件,它的 ...

  5. 今天的码农女孩做了关于文件操作和文件拖拽的笔记 2022/1/21

    文件操作和文件拖拽 文件操作: js有两种机制:一个是事件机制,一个是io机制 文件操作对象: Blob通过二进制数据读取 file读取单个文件对象 fileList读取多个文件对象 fileRead ...

  6. Kettle使用_15 文件操作复制文件到结果

    Kettle使用_15 文件操作复制文件到结果 需求: 通过Kettle的组件实现文件夹下所有文件的复制到另外个文件夹. 解决方法:结合获取文件名.复制文件名到结果.执行作业.添加到结果文件列表.复制 ...

  7. java删除相对路径文件夹_Java IO,io,文件操作,删除文件,删除文件夹,获取文件父级目录...

    Java IO,io,文件操作,删除文件,删除文件夹,获取文件父级目录 这里先简单的贴下常用的方法: File.separator //当前系统文件分隔符 File.pathSeparator// F ...

  8. .NET基础-11-ArrayList|Hashtable|File文件操作|Dircetioy文件夹操作|Path路径操作

    集合 ArrayList与Hashtable应为存在拆箱与装箱,所以性能不怎么好,尽量不要使用,而使用泛型集合 可以使用下面的方式输出所消耗的时间 //ArrayList arl = new Arra ...

  9. Go 文件操作(创建、打开、读、写)

    1.使用io/ioutil进行文件操作: a.读文件: func ReadAll(r io.Reader) ([]byte, error) func ReadFile(filename string) ...

最新文章

  1. 这个Python知识点,90%初学者没太整明白
  2. python中递归函数特点,Python递归函数特点及原理解析
  3. linux下面安装maven
  4. qt mysql 系统时间_使用QT和参数在SQLite数据库中插入日期时间
  5. 在css使用PHP/ASP代码
  6. (转)分布式文件存储FastDFS(二)FastDFS安装
  7. (二)Graphivz 简单结构图及子图
  8. Helm 3 完整教程(二十四):创建和使用子 chart
  9. python安装及运行环境_Python 安装及环境搭建
  10. 从有序数组中找出某个数出现的次数
  11. 解决Vsphere Client 60天过期问题
  12. php代码写一串新年祝福,新年祝福QQ留言代码_把幸福装的满满的
  13. 计算机中的逻辑与或非,与或非运算(与或非逻辑运算口诀)
  14. 亲自用鸿蒙跑了个“hello world”!跑通后,我特么开始怀疑人生....
  15. tc7102路由器虚拟服务器,国内电信推首款WiFi 6+路由器TC7102,5G和WiFi 6成黄金搭档-贤集网...
  16. Comparator.comparing()比较排序(可以jdk8 Strim()结合) 可以通过这个比较排序
  17. 4.深度强化学习------PPG(Phasic Policy Gradient)算法资料+原理整理
  18. 氮化物 聚多巴胺修饰六方氮化硼|铁颗粒周期性填充的竹节状氮化硼纳米管|纳米氮化硼(BN)包覆的Al2O3复合粉|铜纳米线填充氮化硼纳米管
  19. C语言-学生学号成绩读入程序(输出了学生总分、平均分、名次以及学生信息的查询)
  20. 特技摩托前线android安装_特技摩托前线修改中文版-特技摩托前线全摩托解锁版下载7.9.1安卓版-玩友游戏网...

热门文章

  1. 虚拟机为cenots配置网络
  2. python rjust() 方法 与 ljust()方法 的使用
  3. Android SDK 路径修改
  4. github 删除工程的操作
  5. 铁乐学Python_Day35_Socket模块3和hmac模块
  6. [ CodeVS冲杯之路 ] P1116
  7. [WP]使用ApacheCordova开发HTML5-WindowsPhone应用程序
  8. WPF:跨应用程序会话保持和还原应用程序范围的属性
  9. ubuntu中常用指令
  10. linux shell cgi post,linux下shell处理cgi的方法--post get