文件输入输出
写在前面
本文为博主复习笔记,希望对读者有所帮助。
概述
头文件: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;}elsestd::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;in >> fileBuf;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
模式会失败
- 以