【C++】IO库(二):文件输入输出
8.2 文件输入输出
头文件 fstream 定义了三个类型来之支持文件IO,分别是:
- ifstream:从一个给定文件读取数据;
- ofstream:向一个给定文件写入数据;
- fstream:读写给定文件。
在 C++ 当中,可以方便地使用 IO 运算符(<<和>>)对文件进行读写,可以使用getline从一个 ifstream 读取数据。
8.2.1 使用文件流对象
当我们想要读写一个文件时,可以定义一个文件流对象,并将对象与文件关联起来。每个文件流类都定义了一个名为 open 的成员函数,它可以完成一些系统相关的操作,来定位给定文件并视情况打开为读或写模式。
创建文件流对象时,我们可以提供文件名(可选),如果提供了文件名,则 open 自动调用:
ifstream in(ifile); // 构造一个 ifstream 并打开给定文件
ofstream out; // 输出文件流未关联到任何文件
在 C++ 标准下,文件名可以是 string 对象,也可以是 C 风格的字符数组。
用 fstream 代替 iostream&
在要求使用基类型对象的地方,可以用继承类型的对象来替代。这意味着,接受一个 iostream 类型引用参数的函数,可以用一个对应的 fstream(或sstream)类型来调用。即:如果一个函数接受 ostream& 参数,在调用这个函数时,可以传递给它一个 ofstream 对象,对 istream& 和 ifstream 也是类似的。
成员函数 open 和 close
如果我们定义了一个空的文件流对象,可以调用 open 来将它与文件关联起来:
ifstream in(ifile);
ofstream out;
out.open(ifile + ".copy"); // 打开指定文件
如果调用 open 失败,failbit 会被置位。因为 open 的调用可能失败,所以对 open 进行检查是良好的习惯:
if(out) // 检查 open 是否成功
一旦一个文件流被打开,他就将保持与对应文件的关联。对于一个已经打开的文件流,如果再次调用 open,将会失败并且 failbit 会被置位。为了将文件流关联到另一个文件,必须首先关闭已经关联的文件。文件成功关闭之后,我们才可以打开新的文件:
in.close(); // 关闭文件
in.open(ifile + "2"); // 打开另一个文件
自动构造和析构
如下例子的 main 函数将接受一个要处理的文件列表,这种程序可能会出现如下循环:
for(auto p = argv + 1; p != argv + argc; ++ p) {ifstream input(*p); // 创建输出流并打开文件if(input) { // 如果文件成功打开, 处理该文件process(input); } else {cerr << "couldn't open : " + string(*p);}
} // 每个循环 step, input 都会离开作用域, 因此会被销毁
由于 input 是 for 循环的局部变量,它在每一个 step 都要创建和销毁一次。当一个 fstream 对象被销毁时,close 会自动调用。
8.2 文件模式
每个流都有一个关联的文件模式(file mode),用来指出如何使用文件:
- in:以读方式打开;
- out:以写方式打开;
- app:每次写操作前定位到文件末尾(append);
- ate:打开文件后立即定位到文件末尾;
- trunc:截断文件;
- binary:以二进制方式进行 IO;
每个文件流类型都定义了一个默认的文件模式,如果未指定文件模式,就是用默认模式。
以 out 模式打开文件会丢弃已有的数据
默认情况下,当我们打开一个 ofstream 时,文件的内容会被丢弃。阻止一个 ofstream 清空给定文件内容的方法是同时指定 app 模式:
ofstream out("file1"); // 隐含以输出模式打开文件并截断文件
ofstream out2("file1", ofstream::out); // 隐含地截断文件
ofstream out3("file1", ofstream::out | ofstream::trunc);
// 为了保留文件内容, 必须显式地指定 app 模式
ofstream app("file2", ofstream::app); // 隐含为输出模式
ofstream app2("file2", ofstream::out | ofstream::app);
每次调用 open 时都会确定文件模式
对于一个给定流,每当打开文件时,都可以改变其文件模式:
ofstream out;
out.open("scratchpad"); // 模式隐含设置为输出和截断
out.close();
out.open("precious", ofstream::app); // 显式地设置为追加, 隐含输出
out.close();
在每次打开文件时,都要设置文件模式,可能是显式地设置,也可能是隐式地设置。当程序未指定模式时,使用默认值。
相关文章:
【C++】IO库(二):文件输入输出
8.2 文件输入输出 头文件 fstream 定义了三个类型来之支持文件IO,分别是: ifstream:从一个给定文件读取数据;ofstream:向一个给定文件写入数据;fstream:读写给定文件。 在 C 当中,…...
105.【C语言】数据结构之二叉树求总节点和第K层节点的个数
目录 1.求二叉树总的节点的个数 1.容易想到的方法 代码 缺陷 思考:能否在TreeSize函数内定义静态变量解决size的问题呢? 其他写法 运行结果 2.最好的方法:分而治之 代码 运行结果 2.求二叉树第K层节点的个数 错误代码 运行结果 修正 运行结果 其他写法 1.求二…...
力扣637. 二叉树的层平均值
给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 提示: 树中节点数量在 [1, 104] 范围内-231 < Node.val < 231 - 1 代码: /*** Definition for a binary tree node.* stru…...
【前端】Next.js 服务器端渲染(SSR)与客户端渲染(CSR)的最佳实践
关于Next.js 服务器端渲染(SSR)与客户端渲染(CSR)的实践内容方面,我们按下面几点进行阐述。 1. 原理 服务器端渲染 (SSR): 在服务器上生成完整的HTML页面,然后发送给客户端。这使得用户在首次访问时能够…...
路径规划之启发式算法之一:A-Star(A*)算法
A*算法是一种启发式搜索算法,常用于解决路径规划问题。 一、A*算法的定义与原理 A*算法是一种用于在图形或网格中查找最短路径的算法。它在搜索过程中综合考虑了每个节点的实际距离(g值)和预估距离(h值),以…...
Android复习代码1-4章
public class RudioButton extends AppCompatActivity {Overrideprotected void onCreate(Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_rudio_button);// 找到RadioGroup和TextView的实例RadioGroup radioGrou…...
【问题】webdriver.Chrome()设置参数executable_path报不存在
场景1: 标红报错unresolved reference executable_path 场景2: 执行报错TypeError: __init__() got an unexpected keyword argument executable_path 原因: 上述两种场景是因为selenium4开始不再支持某些初始化参数。比如executable_path 解决: 方案…...
win10系统安装docker-desktop
1、开启Hyper-v ———————————————— Hyper-V 是微软提供的一种虚拟化技术,它允许你在同一台物理计算机上运行多个独立的操作系统实例。这种技术主要用于开发、测试、以及服务器虚拟化等领域。 —————————————————————— &#…...
小程序-基于java+SpringBoot+Vue的乡村研学旅行平台设计与实现
项目运行 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:…...
组件A底部栏(position: fixed )事件使用$emit更新内容失败bug解决
今天遇到一个很离奇的bug,记录一下 问题:在组件内底部栏使用$emit触发按钮事件但打印出来的值是初始化的值,更新的值被重置导致更新失败 原因:组件内底部使用了 position: fixed; 固定, 导致组件内插槽 this 与 保存按…...
数据结构——排序第三幕(深究快排(非递归实现)、快排的优化、内省排序,排序总结)超详细!!!!
文章目录 前言一、非递归实现快排二、快排的优化版本三、内省排序四、排序算法复杂度以及稳定性的分析总结 前言 继上一篇博客基于递归的方式学习了快速排序和归并排序 今天我们来深究快速排序,使用栈的数据结构非递归实现快排,优化快排(三路…...
C++的类功能整合
1. 类的基本概念 类是面向对象编程的核心,它封装了数据和操作数据的函数。 #include <iostream> using namespace std;class MyClass { public:int publicData;void publicFunction() {cout << "Public function" << endl;}private:i…...
《String类》
目录 一、定义与概述 二、创建字符串对象 2.1 直接赋值 2.2 使用构造函数 三、字符串的不可变性 四、常用方法 4.1 String对象的比较 4.1.1 比较是否引用同一个对象 4.1.2 boolean equals(Object anObject)方法:按照字典序比较 4.1.3 int compareTo(Strin…...
【docker】docker的起源与容器的由来、docker容器的隔离机制
Docker 的起源与容器的由来 1. 虚拟机的局限:容器的需求萌芽 在 Docker 出现之前,开发和部署软件主要依赖虚拟机(VMs): 虚拟机通过模拟硬件运行操作系统,每个应用程序可以运行在自己的独立环境中。虽然虚…...
Window 安装 Nginx
参考链接 Windows 环境nginx安装使用及目录结构详解_windows 安装nginx-CSDN博客 Nginx 安装及配置教程(Windows)【安装】_nginx下载安装-CSDN博客 安装 1)下载 nginx: download 2)解压 3)启动 3.1)方…...
replace (regexp|substr, newSubstr|function)替换字符串中的指定部分
replace 方法用于替换字符串中的指定部分。它可以接受一个子字符串或正则表达式作为第一个参数,第二个参数是替换的内容。 用法示例 基本替换 let str "Hello, world!"; let newStr str.replace("world", "everyone"); console.lo…...
【ROS2】Ubuntu22.04安装ROS humble
一. ROS简介 1.1 什么是ROS ROS 是一个适用于机器人的开源的元操作系统。它提供了操作系统应有的服务,包括硬件抽象,底层设备控制,常用函数的实现,进程间消息传递,以及包管理。ROS的核心思想就是将机器人的软件功能做…...
cesium 3Dtiles变量
原本有一个变亮的属性luminanceAtZenith,但是新版本的cesium没有这个属性了。于是 let lightColor 3.0result._customShader new this.ffCesium.Cesium.CustomShader({fragmentShaderText:void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial mate…...
配置泛微e9后端开发环境
配置泛微e9的后端开发环境 1.安装jdk1.8(请自行安装并设置环境变量) 2.将服务器上的WEARVER文件夹拷贝到开发环境下(其中要包含ecology和Resin目录) 3.通过idea创建一个基础Java项目,将jdk设置为1.8 4.添加依赖,需要将3个文件夹的所有jar包添加到项目中…...
【Stable Diffusion】安装教程
目录 一、python 安装教程 二、windows cuda安装教程 三、Stable Diffusion下载 四、Stable Diffusion部署(重点) 一、python 安装教程 (1)第一步下载 打开python下载页面,找到python3.10.9,点击右边…...
HEIF Utility终极指南:如何在Windows上免费打开和转换苹果HEIF照片
HEIF Utility终极指南:如何在Windows上免费打开和转换苹果HEIF照片 【免费下载链接】HEIF-Utility HEIF Utility - View/Convert Apple HEIF images on Windows. 项目地址: https://gitcode.com/gh_mirrors/he/HEIF-Utility 还在为iPhone照片在Windows电脑上…...
如何用5分钟彻底解决Mac菜单栏混乱?Ice菜单栏管理工具终极指南
如何用5分钟彻底解决Mac菜单栏混乱?Ice菜单栏管理工具终极指南 【免费下载链接】Ice Powerful menu bar manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ice/Ice 你是否曾盯着Mac屏幕顶部那密密麻麻的图标海洋感到无力?Wi-Fi图…...
从STM32到华大HC32F460:USB HOST MSC + FatFs R0.13c移植避坑全记录
从STM32到华大HC32F460:USB HOST MSC FatFs R0.13c移植实战指南 作为一名长期使用STM32的嵌入式开发者,第一次接触华大半导体的HC32F460系列MCU时,既兴奋又忐忑。兴奋的是国产MCU的性能已经能够媲美国际大厂,忐忑的是生态差异带来…...
如何快速安装HS2汉化补丁:完整游戏优化指南
如何快速安装HS2汉化补丁:完整游戏优化指南 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF Patch是HoneySelect2玩家的终极解决方案…...
基于LLM智能体的自动化研究工具autoresearch:从部署到实战调优
1. 项目概述:当AI成为你的全职研究助理如果你也曾在深夜面对海量文献、数据报告和网络信息感到无从下手,或者为一个研究课题的初步资料搜集耗费数天时间却收效甚微,那么darks0l/autoresearch这个项目可能会让你眼前一亮。简单来说,…...
WinForm + Modbus 上位机温湿度数据采集系统
前言工业自动化和环境监控领域,实时掌握现场的温湿度数据至关重要。传统的监控方式往往依赖人工记录或简单的报警装置,缺乏直观性和连续性。本文推荐一个基于WinForm开发的上位机温湿度采集系统,通过Modbus通信协议与下位机进行数据交互&…...
StofDoctrineExtensionsBundle的IpTraceable扩展:自动记录用户IP地址的简单实现指南 [特殊字符]
StofDoctrineExtensionsBundle的IpTraceable扩展:自动记录用户IP地址的简单实现指南 🚀 【免费下载链接】StofDoctrineExtensionsBundle Integration bundle for DoctrineExtensions by l3pp4rd in Symfony 项目地址: https://gitcode.com/gh_mirrors/…...
别再瞎学 C 语言了!真・胎教级入门教程 | NO.3 万字详解分支与循环 | 下篇
欢迎大家来到<<别再瞎学 C 语言了!真・胎教级入门教程 | NO.3 万字详解分支与循环>>下篇学习.在上期中我们已经了解了分支与循环中的if语句,关系操作符,条件操作符,逻辑操作符和switch语句.这一期我们继续来了解剩下的内容.6. while循环在C语言中有三种…...
基于h2oGPT构建本地私有化知识库:从RAG原理到实战部署
1. 项目概述:一个真正私密的本地文档智能助手 如果你和我一样,对把敏感的工作文档、个人笔记或者内部资料上传到云端总有些提心吊胆,但又眼馋ChatGPT那种强大的文档理解和对话能力,那么h2oGPT的出现,可以说是解了我们…...
前端工程化:代码审查最佳实践
前端工程化:代码审查最佳实践 前言 代码审查是保障代码质量的第一道防线。一个好的代码审查流程不仅能发现潜在的bug,还能促进团队知识共享,提升整体代码水平。今天我就来给大家讲讲如何建立一套高效的代码审查流程。 什么是代码审查 代码审查…...
