🥑文件输入输出
2022-5-18
| 2023-8-2
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property

 
 
头文件fstream定义了三个类型来支持文件IO:ifstream 从给定文件读取数据,ofstream 向指定文件写入数据,fstream 可以同时读写指定文件。
notion image
这些类型提供的操作与对象cincout的操作一样。可以用IO运算符(<<>>)来读写文件,可以用getline从一个ifstream读取数据。
 
除了继承自iostream类型的行为之外,fstream中定义的类型还增加了一些新的成员来管理与流关联的文件。下表列出了这些操作,可以对fstreamifstreamofstream对象调用这些操作,但不能对其他IO类型调用这些操作:
notion image
 
 

使用文件流对象

当想要读写文件时,通常要定义一个文件流对象,并且将之关联到一个文件上。每个文件流对象都定义了open成员函数,它会做与系统相关的操作来定位给定的文件,并且视情况打开它进行读或写操作。
使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系。文件常见的打开方式如下:
notion image
 
 
当创建文件流对象时可以选择性的提供一个文件名,如果提供了文件名,那么open就会自动调用:
C++11中,文件流对象的文件名可以是 string 对象或C风格字符数组。旧版本的标准库只支持C风格字符数组。
 
使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写,其中对文件进行提取和插入操作的常用成员函数如下:
notion image
拷贝一份test.cpp文件生成copy.cpp
 
以二进制的形式操作文件:
以文本的形式操作文件
 
 
 

用fstream 代替iostream&

在要求使用基类对象的地方,可以用继承类型的对象代替。因此一个接受 iostream 类型引用或指针参数的函数,可以用对应的 fstream 类型(或sstream类型)来调用。也就是说,如果有一个函数接受一个ostream&参数,在调用这个函数时,可以传递给它一个 ofstream对象,对istream&ifstream也是类似的。
 

open 和 close 成员函数

当定义一个空的文件流对象时,可以接着在后面通过 open 将其关联到一个文件上:
如果调用open失败,会设置 failbit,由于 open 可能会失败,所以最好需要验证一下 open 是否成功:
如果打开失败,条件将会失败,就不能使用 out 对象。
 
一旦一个文件流对象被打开,它将与给定的文件持续关联。如果在一个已经打开的文件流对象上调用 open 将会失败,并且设置 failbit。接下来尝试使用这个文件流将会失败。为了将文件流对象关联到一个不同的文件上,需要选将之前的文件关闭,才能打开新的文件:
如果 open 成功的话,open 会将流的状态设置为 0 ,这样 good() 将返回 true
fstream 对象被销毁时,close 会自动被调用。
 

自动构建和析构

每次迭代时都会自动创建一个新的名为inputifstream对象并打开给定文件。由于inputwhile中的本地对象,它将在每次迭代时自动的创建和销毁。当fstream对象离开作用域之后,与其关联的文件会自动关闭。在下一次迭代时会创建一个新的。
 
 
 
 

文件模式

每个流都有一个关联的文件模式,用来指出如何使用文件:
notion image
指定文件模式有如下限制:
  • 只能对 ofstreamfstream 对象设定 out 模式
  • 只能对 ifstreamfstream 对象设定 in 模式
  • 只有当 out 被设定时才能设定 trunc 模式
  • 只要 trunc 没被设定,就能设定 app 模式。在 app 模式下,即使没有设定 out 模式,文件也是以输出方式打开
  • 默认情况下,即使没有设定 trunc,以 out 模式打开的文件也会被截断。如果想保留以 out 模式打开的文件内容,就必须同时设定 app 模式,这会将数据追加写到文件末尾;或者同时设定 in 模式,即同时进行读写操作
  • atebinary 模式可用于任何类型的文件流对象,并可以和其他任何模式组合使用
  • ifstream 对象关联的文件默认以 in 模式打开,与 ofstream 对象关联的文件默认以 out 模式打开,与 fstream 对象关联的文件默认以 inout 模式打开
 
每个文件流类型都定义了一个默认的文件模式,当未指定文件模式时,就使用此默认模式。与 ifstream 关联的文件默认以 in 模式打开;与 ofstream 关联的文件默认以 out 模式打开;与 fstream 关联的文件默认以 inout 模式打开。
 
默认情况下,打开ofstream 对象时,文件内容会被丢弃,阻止一个 ofstream 清空给定文件内容的方法是同时指定 app 模式:
保留被ofstream打开的文件中已有数据的唯一方法是显式指定appin模式
 
流对象每次打开文件时都可以改变其文件模式:
保留被 ofstream 打开的文件中已有数据的唯一方法是显式指定 appin 模式。
  • C++
  • IO类string流
    目录