当前位置: 首页 > news >正文

文件输入输出

写在前面

本文为博主复习笔记,希望对读者有所帮助。

概述

头文件: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

当我们未指定文件模式时,不同的文件流类型有默认的文件模式:

文件流类型默认模式等效显式模式说明
ifstreamios::inios::in只读方式打开文件
ofstreamios::outios::out | ios::trunc写入方式打开并截断文件
fstream无默认模式-必须显式指定模式

补充说明

  1. ifstream 细节

    • 如果文件不存在,打开会失败
    • 可以添加 ios::binary 模式进行二进制读取
  2. ofstream 细节

    • 如果文件不存在,会创建新文件
    • 如果文件存在,默认会清空文件内容
    • 可以添加 ios::app 模式改为追加写入
  3. fstream 细节

    • 必须显式指定至少 ios::inios::out 之一
    • 常见组合:
      • ios::in \| ios::out:可读可写(不截断)
      • ios::in \| ios::out \| ios::trunc:可读可写并截断
      • ios::in \| ios::out \| ios::app:可读可追加写入
  4. 模式继承关系

    • ios::inios::out 是基础模式
    • ios::truncios::app 是修饰模式
    • ios::binary 是独立模式,可与任何模式组合

文件模式有如下使用限制:

  1. 基本限制

    • 必须至少指定 inout 模式之一
    • 不能同时指定 truncapp 模式(互斥)
  2. ifstream 限制

    • 只能使用 in 模式(默认)
    • 可以组合 binary 模式
    • 不能使用 outtruncapp 模式
  3. ofstream 限制

    • 默认使用 out|trunc 模式
    • 可以组合 app 模式(但不能与 trunc 同时使用)
    • 可以组合 binary 模式
    • 不能单独使用 in 模式
  4. fstream 限制

    • 默认无模式(需要显式指定)
    • 可以组合 inout 模式
    • 可以组合 truncapp 模式(但不能同时)
    • 可以组合 binary 模式
  5. 特殊限制

    • out 模式打开但不指定 apptrunc 时:
      • 如果文件存在,内容不会被自动截断
      • 如果文件不存在,会创建新文件
    • ate 模式只影响初始位置,不影响写入行为
    • binary 模式必须显式指定,否则默认为文本模式
  6. 错误情况

    • in 模式打开不存在的文件会失败
    • trunc 模式打开但未指定 out 会失败
    • 对只读文件(系统权限)尝试 out 模式会失败
    • 对只写文件(系统权限)尝试 in 模式会失败
http://www.lqws.cn/news/492265.html

相关文章:

  • LNMP一键自动化部署
  • RISC-V 指令集拓展类别
  • Redis反序列化失败问题
  • NW896NX769美光固态芯片NX790NX793
  • Lamp和友点CMS一键部署脚本(Rocky linux)
  • Flink维表应用:从思考到实践的全面解析
  • Linux切换中文输入法
  • 使用.detach()代替requires=False避免计算图错误
  • GPIO-LED驱动
  • STM32学习笔记
  • 深入浅出Node.js后端开发
  • 可信计算的基石:TPM技术深度解析与应用实践
  • 2025.06.23【甲基化】methylKit:甲基化测序数据分析安装与详细使用教程
  • 常用终端命令(Linux/macOS/bash 通用)分类速查表
  • Docker 永久换源步骤
  • C++之二叉搜索树及其实现
  • 嘉讯科技:医院电子病历系统的关键性作用
  • 【Java开发日记】我们详细讲解一下 Java 中 new 一个对象的流程
  • 智慧水利新引擎,数字孪生流域解决方案
  • 领域驱动设计(DDD)【7】之数据库设计
  • 基于 Spark 实现 COS 海量数据处理
  • AntDesign栅格系统全解析:Row与Col实战指南
  • Java封装过程中的getter/setter究竟有什么用?
  • 爬虫003----requests库
  • ABP VNext + Apache Kafka Streams:构建高吞吐、生产级实时流处理服务
  • 自回归(AR)与掩码(MLM)的核心区别:续写还是补全?
  • 采集MFC软件的数据方法记录
  • 【Java面试】你是怎么控制缓存的更新?
  • Linux系统能ping通ip但无法ping通域名的解决方法
  • 【源码+文档+调试讲解】基于web的运动健康小程序的设计与实现y196