C++ | 高级教程 | 文件和流
👻 概念
文件流输出使用标准库 fstream,定义三个新的数据类型:
| 数据类型 | 描述 |
|---|---|
ofstream | 输出文件流,用于创建文件并向文件写入信息。 |
ifstream | 输入文件流,用于从文件读取信息。 |
fstream | 文件流,且同时具有 ofstream 和 ifstream 两种功能,意味着可以创建文件,写入信息,读取信息 |
👻 准备工作
- 使用文件流需要包含
<iostream>和<fstream>头文件
#include <fstream>
#include <iostream>
👻 打开文件
👾语法格式
使用 open() 函数打开文件,是 fstream、ifstream 、ofstream 对象的成员
void open(const char *filename, ios::openmode mode);
-
参数
filename—— 打开文件的名称和位置 -
参数
mode—— 文件被打开的模式模式标志 描述 ios::app追加模式,所有写入都追加到文件末尾 ios::ate文件打开后定位到文件末尾 ios::in打开文件用于读取 ios::out打开文件用于写入 ios::trunc如果该文件已经存在,其内容将在打开文件之前被截断,即把文件长度设为 0
👾示例代码
-
示例1:以写入模式打开文件,并希望截断文件,以防文件已存在
ofstream outfile; outfile.open("file.dat", ios::out | ios::trunc ); -
示例2:打开一个文件用于读写
ifstream infile; infile.open("file.dat", ios::out | ios::in );
👻 关闭文件
👾语法格式
使用 close() 函数打开文件,是 fstream、ifstream 、ofstream 对象的成员。
程序终止时,会自动关闭刷新所有流,释放所有分配的内存,并关闭所有打开的文件
void close();
👾示例代码
outfile.close();
👻 写入文件
👾语法格式
使用流插入运算符 << 向文件写入信息,使用的是 ofstream 或 fstream 对象
ofstream << data;
👻 读取文件
👾语法格式
使用流提取运算符 >> 向文件写入信息,使用的是 ifstream 或 fstream 对象
ifstream >> data;
👻 文件位置指针
👾语法格式
使用 istream 的 seekg(seek get)和关于 ostream 的 seekp(seek put)重新定位文件位置指针。
istream& seekg(streampos pos);
ostream& seekp(streampos pos);
-
参数
pos—— 直接定位到流中的绝对位置,其中streampos是一个表示流位置的类型istream& seekg(streamoff off, ios::seekdir dir); ostream& seekp(streamoff off, ios::seekdir dir); -
参数
off—— 偏移量(正数/负数) -
参数
dir—— 定位方向模式标志 描述 ios::beg从流的开头开始计算偏移量 ios::cur从当前读取位置开始计算偏移量 ios::end从流的末尾开始计算偏移量
👾示例代码
文件位置指针是一个整数值,指定了从文件的起始位置到指针所在位置的字节数。
// 定位到 fileObject 的第 n 个字节(假设是 ios::beg)
fileObject.seekg(n);// 把文件的读指针从 fileObject 当前位置向后移 n 个字节
fileObject.seekg(n, ios::cur);// 把文件的读指针从 fileObject 末尾往回移 n 个字节
fileObject.seekg(n, ios::end);// 定位到 fileObject 的末尾
fileObject.seekg(0, ios::end);
👻 综合实例
char data[100];// 写模式打开文件
ofstream outfile;
outfile.open("test.txt");
cout << "Writing to the file" << endl;// 写入数据
cout << "Enter your name: ";
cin.getline(data, 100);
outfile << data << endl;cout << "Enter your age: ";
cin >> data;
cin.ignore();
outfile << data << endl;// 关闭文件
outfile.close();
char data[100];// 读模式打开文件
ifstream infile;
infile.open("test.txt");
cout << "Reading from the file" << endl;// 读取数据
infile >> data;
cout << data << endl;
infile >> data;
cout << data << endl;// 关闭文件
infile.close();
cin.getline( )与cin >>区别
cin.getline( )cin >>读取方式 按行读取 —— 读取输入流中的字符,直到遇到换行符 \n为止,并将换行符之前的字符存储到目标字符串中。逐个单词读取 —— 读取输入流中的下一个非空白字符,直到遇到空白字符(如空格、制表符 \t、换行符\n)为止前导空白字符 从当前输入流的位置开始读取,不跳过前导空白字符 跳过输入流前面所有前导空白字符 存储换行符 读取到换行符为止,存储换行符之前的字符,并自动处理换行符 不会读取换行符 清理缓冲区 自动处理换行符,不需要额外清理缓冲区 手动清理输入缓冲区中的换行符,如使用 cin.ignore()用途 读取整行文本 读取单个单词或数字 理解 输入 ABCDEFG\n,读取ABCDEFG\n,并自动处理换行符,输入变量值为ABCDEFG,缓冲区为空输入 ABCDEFG\n,读取ABCDEFG,输入变量值为ABCDEFG,缓冲区为\n,为避免影响后面的输入,需要手动清理
cin.ignore( )的作用主要用于清除缓冲区中的换行符,以避免影响后续的输入操作,即手动清理缓冲区。对代码:
cout << "Enter your name: "; cin.getline(data, 100); // 读取姓名 outfile << data << endl;cout << "Enter your age: "; cin >> data; // 读取年龄 cin.ignore(); // 清除缓冲区中的换行符 outfile << data << endl;cout << "Enter your address: "; cin.getline(data, 100); // 读取地址 outfile << data << endl;如果移除
cin.ignore()语句,
- 缓冲区中的换行符
\n会被cin.getline()读取,导致data被赋值为空字符串,该输入被跳过。- 文件中写入的内容会变成:
John Doe 25
如果使用了
cin.ignore(),
- 缓冲区中的换行符会被清除,
cin.getline()会正确读取用户输入的地址。- 文件中写入的内容会是:
John Doe 25 Your Address
相关文章:
C++ | 高级教程 | 文件和流
👻 概念 文件流输出使用标准库 fstream,定义三个新的数据类型: 数据类型描述ofstream输出文件流,用于创建文件并向文件写入信息。ifstream输入文件流,用于从文件读取信息。fstream文件流,且同时具有 ofst…...
Starlink卫星动力学系统仿真建模第九讲-滑模(SMC)控制算法原理简介及卫星控制应用
滑模控制(Sliding Mode Control)算法详解 一、基本原理 滑模控制(Sliding Mode Control, SMC)是一种变结构控制方法,通过设计一个滑模面(Sliding Surface),迫使系统状态在有限时间内…...
JVM相关面试题
1. 类加载与双亲委派机制 聊一下你对类加载器的理解。 类加载器是JVM用来加载类文件到内存的组件。它负责将字节码文件解析为java.lang.Class实例,并存储到运行时数据区的方法区中。类加载器分为Bootstrap ClassLoader、Extension ClassLoader和Application ClassLo…...
WiFi定位:宠物安全的“秘密武器”
从「全网寻狗」到「实时掌控」的进化史 凌晨三点收到邻居转发的「寻狗启事」,配图里的金毛犬项圈上赫然挂着某品牌定位器 —— 这样的魔幻场景在养宠圈并不罕见。随着宠物经济突破 3000 亿规模,智能定位器早已从「小众玩具」变成「刚需装备」。但你知道…...
【git】【reset全解】Git 回到上次提交并处理提交内容的不同方式
Git 回到上次提交并处理提交内容的不同方式 在 Git 中,若要回到上次提交并对提交内容进行不同处理,可使用 git reset 命令搭配不同选项来实现。以下为你详细介绍操作步骤及各选项的作用。 1. 查看提交历史 在操作之前,可通过以下命令查看提…...
【leetcode hot 100 11】移动零
一、暴力解法:两个 for 循环,外层循环遍历所有可能的左边界,内层循环遍历所有可能的右边界 class Solution {public int maxArea(int[] height) {int max_area0;for(int i0; i<height.length; i){for(int ji1; j<height.length; j){in…...
DeepSeek 部署实战:Ollama + 多客户端 + RAG
DeepSeek 部署实战:Ollama 多客户端 RAG 一、前置条件 (一)硬件要求 GPU:强烈建议使用 NVIDIA RTX 3090 或更高型号,显存至少 24GB。小显存跑大模型会遇到诸多问题,本人亲测 2080Ti 跑模型体验不佳。内…...
Linux通过设备名称如何定位故障硬盘
因为ceph集群的服务器硬盘都是直通的,当我们发现有硬盘存储坏道需要更换硬盘,但是因为盘序可能不是连续的,无法定位服务器上那块硬盘是故障的,如果冒然测试可能把正常的硬盘拔出,得不偿失,所以就写一下我定…...
大模型基础概念之神经网络宽度
在大模型中,神经网络宽度是提升模型容量的核心手段之一,与深度、数据规模共同构成性能的三大支柱。合理增加宽度可显著增强模型表达能力,但需结合正则化、硬件优化和结构设计进行平衡。未来趋势可能包括动态宽度调整、稀疏化宽度设计(如MoE)以及更高效宽度-深度复合缩放策…...
数据开发的简历及面试
简历 个人信息: 邮箱别写QQ邮箱, 写126邮箱/189邮箱等 学历>>本科及以上写,大专及以下不写 专业>>非计算机专业不写 政治面貌>>党员写, 群众不用写 掌握的技能: 精通 > 熟悉 > 了解 专业工具: 大数据相关的 公司: 如果没有可以写的>>金融服…...
数据存储:一文掌握存储数据到ElasticSearch详解
文章目录 一、Elasticsearch简介二、Python与Elasticsearch交互2.1 安装必要的库2.2 连接到Elasticsearch服务器 三、数据准备四、创建索引(可选)五、存储数据5.1 单个文档索引5.2 批量索引 六、查询数据七、更新和删除数据7.1 更新文档7.2 删除文档 八、…...
Pytorch使用手册--将 PyTorch 模型导出为 ONNX(专题二十六)
注意 截至 PyTorch 2.1,ONNX 导出器有两个版本。 torch.onnx.dynamo_export 是最新的(仍处于测试阶段)导出器,基于 PyTorch 2.0 发布的 TorchDynamo 技术。 torch.onnx.export 基于 TorchScript 后端,自 PyTorch 1.2.0 起可用。 一、torch.onnx.dynamo_export使用 在 60 …...
Vue2+Element实现Excel文件上传下载预览
目录 一、需求背景 二、落地实现 1.文件上传 图片示例 HTML代码 业务代码 2.文件下载 图片示例 方式一:代码 方式二:代码 3.文件预览 图片示例 方式一:代码 方式二:代码 一、需求背景 在一个愉快的年后ÿ…...
物联网平台建设方案一
系统概述 构建物联网全域支撑服务能力,为实现学院涵盖物联网设备的全面感知、全域互联、全程智控、全域数字基底、全过程统筹管理奠定基础,为打造智能化提供坚实后台基石。 物联网平台向下接入各种传感器、终端和网关,向上通过开放的实施分…...
机器学习破局指南:零基础6个月系统训练计划
以下是为零基础学习者制定的「机器学习」系统学习计划(含学习路径资源推荐),分为6个阶段,建议学习周期4-6个月: 一、基础准备阶段(1-2周) 目标:掌握必要数学工具与编程基础 数学基础…...
mmdetection框架下使用yolov3训练Seaships数据集
之前复现的yolov3算法采用的是传统的coco数据集,这里我需要在新的数据集上跑,也就是船舶检测方向的SeaShips数据集,这里给出教程。 Seaships论文链接:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber8438999 一、…...
unity学习52:UI的最基础组件 rect transform,锚点anchor,支点/轴心点 pivot
目录 1 image 图像:最简单的UI 1.1 图像的基本属性 1.2 rect transform 1.3 image的component: 精灵 → 图片 1.4 修改颜色color 1.5 修改材质 1.6 raycast target 1.7 maskable 可遮罩 1.8 imageType 1.9 native size 原生大小 2 rect transform 2.1 …...
STM32MP15-FSMP1A单片机移植Linux系统platform总线驱动
之前在该单片机下移植的Linux驱动是学习过程中,对Linux内核驱动的引导学习,接下来才是比较正常的驱动开发。 在Linux内核中,对于驱动的处理,一般会通过总线进行设备信息和设备驱动的匹配,来达到自动检测外设连接系统以…...
Java 常见的面试题(设计模式)
一、说一下你熟悉的设计模式? **设计模式:**是一套被反复使用的代码设计经验的总结(情境中一个问题经过证实的一个解决方案)。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式使人们可以更加简…...
机器学习3-聚类
1 聚类解决的问题 知识发现,发现事物之间的潜在关系异常值检测特征提取 数据压缩的例子新闻自动分组、用户分群、图像分割、像素压缩等等 2 与监督学习比较 监督学习是需要给定X、Y,X为特征,Y为标签,选择模型,学习&a…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...

