写在前面
本文为博主复习笔记,希望对读者有所帮助。
概述
头文件:fstream。
三个类:
- ifstream,读
- ofstream,写
- fstream,读写
在学习文件输入输出时,应该和之前学过的IO类关联起来。
fstream 特有操作表
操作/函数 | 说明 |
---|---|
fstream fstrm; |
创建一个未绑定的文件流对象 |
fstream fstrm(s); |
创建文件流并打开名为 s 的文件 |
fstream fstrm(s, mode); |
以指定模式 mode 打开文件 s |
fstrm.open(s) |
打开名为 s 的文件并将文件与 fstrm 绑定 |
fstrm.open(s, mode) |
以指定模式 mode 打开文件 s |
fstrm.close() |
关闭与 fstrm 绑定的文件 |
fstrm.is_open() |
返回 bool 值,指示关联文件是否成功打开 |
模式组合示例
组合 | 等效效果 |
---|---|
ios::out | ios::trunc |
打开文件并截断(默认输出模式) |
ios::out | ios::app |
打开文件追加写入 |
ios::in | ios::out |
打开文件可读写 |
ios::in | ios::out | ios::trunc |
打开文件可读写并截断 |
有了上面三个表,我们看看如何使用文件流对象。
使用文件流对象
当我们想要读写一个文件时,可以定义一个文件流对象,并将对象与文件流关联起来。
#include <iostream>
#include <fstream>
#include <string>
const std::string FileName{ "test.txt" };
void test_ostream()
{
std::ofstream out("test.txt");//默认的写入指针是位于文件头的
if (!out.is_open())
{
std::cerr << "打开文件失败" << std::endl;
out.close();
return;
}
else
std::cout << "打开文件成功" << std::endl;
std::string str{ "测试\n文本" };
std::cout << "向文件写入内容:" << str << std::endl;
out << str << std::endl;//<<操作符遇到换行符或者空格符不会停止写入
out.close();
}
void test_ifstream()
{
std::ifstream in("test.txt");
if (!in.is_open())
{
std::cerr << "读取文件失败\n";
in.close();
return;
}
std::cout << "打开文件成功" << std::endl;
std::string fileBuf;
while (in>>fileBuf) //文本中有换行时,直接读取不会换行
std::cout<<fileBuf<<std::endl;//所以需要加上endl
std::cout << fileBuf;
in.close();
}
上述代码展示了文件输入、输出流的基本使用方式。当一个文件流对象被销毁时,会自动调用close
。
文件模式
模式标志 | 说明 |
---|---|
ios::in |
以读方式打开 |
ios::out |
以写方式打开 |
ios::app |
每次写操作前定位到文件末尾 |
ios::ate |
打开文件后立即定位到文件末尾 |
ios::trunc |
截断文件 |
ios::binary |
以二进制方式进行IO |
当我们未指定文件模式时,不同的文件流类型有默认的文件模式:
文件流类型 | 默认模式 | 等效显式模式 | 说明 |
---|---|---|---|
ifstream |
ios::in |
ios::in |
只读方式打开文件 |
ofstream |
ios::out |
ios::out | ios::trunc |
写入方式打开并截断文件 |
fstream |
无默认模式 | - | 必须显式指定模式 |
补充说明
ifstream
细节- 如果文件不存在,打开会失败
- 可以添加
ios::binary
模式进行二进制读取
ofstream
细节- 如果文件不存在,会创建新文件
- 如果文件存在,默认会清空文件内容
- 可以添加
ios::app
模式改为追加写入
fstream
细节- 必须显式指定至少
ios::in
或ios::out
之一 - 常见组合:
ios::in \| ios::out
:可读可写(不截断)ios::in \| ios::out \| ios::trunc
:可读可写并截断ios::in \| ios::out \| ios::app
:可读可追加写入
- 必须显式指定至少
模式继承关系
ios::in
和ios::out
是基础模式ios::trunc
和ios::app
是修饰模式ios::binary
是独立模式,可与任何模式组合
文件模式有如下使用限制:
基本限制
- 必须至少指定
in
或out
模式之一 - 不能同时指定
trunc
和app
模式(互斥)
- 必须至少指定
ifstream
限制- 只能使用
in
模式(默认) - 可以组合
binary
模式 - 不能使用
out
、trunc
或app
模式
- 只能使用
ofstream
限制- 默认使用
out|trunc
模式 - 可以组合
app
模式(但不能与trunc
同时使用) - 可以组合
binary
模式 - 不能单独使用
in
模式
- 默认使用
fstream
限制- 默认无模式(需要显式指定)
- 可以组合
in
和out
模式 - 可以组合
trunc
或app
模式(但不能同时) - 可以组合
binary
模式
特殊限制
- 以
out
模式打开但不指定app
或trunc
时:- 如果文件存在,内容不会被自动截断
- 如果文件不存在,会创建新文件
ate
模式只影响初始位置,不影响写入行为binary
模式必须显式指定,否则默认为文本模式
- 以
错误情况
- 以
in
模式打开不存在的文件会失败 - 以
trunc
模式打开但未指定out
会失败 - 对只读文件(系统权限)尝试
out
模式会失败 - 对只写文件(系统权限)尝试
in
模式会失败
- 以