C++ | 高级教程 | 文件和流

👻 概念

文件流输出使用标准库 fstream,定义三个新的数据类型:

数据类型描述
ofstream输出文件流,用于创建文件并向文件写入信息。
ifstream输入文件流,用于从文件读取信息。
fstream文件流,且同时具有 ofstreamifstream 两种功能,意味着可以创建文件,写入信息,读取信息

👻 准备工作

  • 使用文件流需要包含 <iostream><fstream> 头文件
#include <fstream>
#include <iostream>

👻 打开文件

👾语法格式

使用 open() 函数打开文件,是 fstreamifstreamofstream 对象的成员

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() 函数打开文件,是 fstreamifstreamofstream 对象的成员。

程序终止时,会自动关闭刷新所有流,释放所有分配的内存,并关闭所有打开的文件

void close();

👾示例代码

outfile.close();

👻 写入文件

👾语法格式

使用流插入运算符 << 向文件写入信息,使用的是 ofstreamfstream 对象

ofstream << data;

👻 读取文件

👾语法格式

使用流提取运算符 >> 向文件写入信息,使用的是 ifstreamfstream 对象

ifstream >> data;

👻 文件位置指针

👾语法格式

使用 istreamseekg(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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/978983.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux:Shell环境变量与命令行参数

目录 Shell的变量功能 什么是变量 变数的可变性与方便性 影响bash环境操作的变量 脚本程序设计&#xff08;shell script&#xff09;的好帮手 变量的使用&#xff1a;echo 变量的使用&#xff1a;HOME 环境变量相关命令 获取环境变量 环境变量和本地变量 命令行…

Halcon 学习之路 set_grayval 算子

gen_imag_const 创建灰度图像 gen_image_const(Image&#xff0c;Type&#xff0c;Width&#xff0c;Height) 算子gen_image_const创建指定大小的图像&#xff0c;图像的宽度和高度由Width和Height决定 Type 像素类型 byte :每像素1字节&#xff0c;无符号&#xff08;0-255&…

基于springboot学生管理系统

目录 项目介绍 图片展示 运行环境 项目介绍 管理员 学生信息管理&#xff1a;查询、添加、删除、修改学生信息 班级信息管理&#xff1a;查询、添加、删除、修改班级信息 教师信息管理&#xff1a;查询、添加、删除、修改教师信息 课程信息管理&…

wav格式的音频压缩,WAV 转 MP3 VBR 体积缩减比为 13.5%、多个 MP3 格式音频合并为一个、文件夹存在则删除重建,不存在则直接建立

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 问题一&#xff1a;wav格式的音频压缩为哪些格式&#xff0c;网络传输给用户播放…

JavaWeb-Servlet对象生命周期

文章目录 关于Servlet对象的生命周期创建和销毁Servlet对象的流程测试先后顺序在服务器启动时就创建实例tip: init和无参构造的作用差不多, 为什么定义的规范是init() 关于Servlet对象的生命周期 我们都知道, 我们开发一个Servlet程序的时候, 每一个类都要实现Servlet接口, 然…

在docker容器中运行Ollama部署deepseek-r1大模型

# 启动ollama容器 docker run -itd --gpusall -v /app/ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama:0.5.12# 进入容器 docker exec -it ollama bash ## 拉取大模型&#xff08;7B为例&#xff09; ollama pull deepseek-r1:7b## 修改监听地址和端口 expo…

git - study

文章目录 git - study概述可以用 git gui工具来添加快捷命令工具如果要在提交日志中搜索&#xff0c;可以用gitk的view编辑功能实验环境直接用git自带环境进行git操作的好处查看git所有配置配置全局数据配置项目专用的数据查询配置数据的原始值配置git使用的文本编辑器获取某个…

光谱相机的市场发展趋势

市场规模增长 整体市场稳步扩张&#xff1a;据贝哲斯咨询预测&#xff0c;高光谱相机市场在未来几年将保持稳步增长&#xff0c;2022 年市场规模约为 20 亿美元&#xff0c;预计到 2027 年将达到 30 亿美元&#xff0c;年均复合增长率约为 8%&#xff0c;到 2030 年市场规模将…

编写一个程序,输入两个数字并输出它们的和(Python版)

编写一个程序&#xff0c;输入两个数字并输出它们的和 以下是一个简单的 Python 程序&#xff0c;它会从用户输入中读取两个数字&#xff0c;并输出它们的和&#xff1a; # 获取用户输入的两个数字 num1 float(input("请输入第一个数字: ")) num2 float(input(&qu…

STM32——HAL库开发笔记21(定时器2—输出比较)(参考来源:b站铁头山羊)

本文主要讲述输出比较及PWM信号相关知识。 一、概念 所谓输出比较&#xff0c;就是通过单片机的定时器向外输出精确定时的方波信号。 1.1 PWM信号 PWM信号即脉冲宽度调制信号。PWM信号的占空比 &#xff08;高电压 所占周期 / 整个周期&#xff09; * 100% 。所以PWM信号…

1.2 Kaggle大白话:Eedi竞赛Transformer框架解决方案02-GPT_4o生成训练集缺失数据

目录 0. 本栏目竞赛汇总表1. 本文主旨2. AI工程架构3. 数据预处理模块3.1 配置数据路径和处理参数3.2 配置API参数3.3 配置输出路径 4. AI并行处理模块4.1 定义LLM客户端类4.2 定义数据处理函数4.3 定义JSON保存函数4.4 定义数据分片函数4.5 定义分片处理函数4.5 定义文件名排序…

从零开始自主「起身站立」,上海AI Lab发布最新控制算法,机器人:起猛了

来源 | 机器之心 近日&#xff0c;上海 AI Lab 具身智能中心研究团队在机器人控制领域取得了最新突破&#xff0c;提出的 HoST&#xff08;Humanoid Standing-up Control&#xff09;算法&#xff0c;成功让人形机器人在多种复杂环境中实现了自主站起&#xff0c;并展现出强大…

C#贪心算法

贪心算法&#xff1a;生活与代码中的 “最优选择大师” 在生活里&#xff0c;我们常常面临各种选择&#xff0c;都希望能做出最有利的决策。比如在超市大促销时&#xff0c;面对琳琅满目的商品&#xff0c;你总想用有限的预算买到价值最高的东西。贪心算法&#xff0c;就像是一…

登录次数限制

文章目录 一、应用场景与设计目的1. 应用场景2. 设计目的 二、功能设计1. 登录限制规则2. 解锁机制3. 适用维度 三、技术实现1. 数据存储2. 逻辑流程3. 实现代码示例4. 动态锁定时间 四、安全增强与扩展1. 防止用户名枚举2. 加入验证码3. 监控与报警4. 分布式支持 五、设计思考…

Java从根上理解 ConcurrentHashMap:缓存机制与性能优化

目录 一、ConcurrentHashMap 的核心原理1. 数据结构2. 锁机制3. 扩容机制二、ConcurrentHashMap 的缓存机制1. 缓存的实现2. 缓存的更新策略三、ConcurrentHashMap 的性能优化1. 减少锁竞争2. 优化数据结构3. 合理设置容量和负载因子四、具体代码示例1. 创建 ConcurrentHashMap…

C++ 常见面试知识点

主要介绍C常见面试题 1、说一下你理解的C中的四种智能指针 常用接口 T* get(); T& operator*(); T* operator->(); T& operator(const T& val); T* release(); 将 封装在内部的指针置为nullptr, 但并不会破坏指针所指向的内容, 函 数返回的是内部指针置空之前…

蓝桥杯单片机组第十二届省赛第二批次

前言 第十二届省赛涉及知识点&#xff1a;NE555频率数据读取&#xff0c;NE555频率转换周期&#xff0c;PCF8591同时测量光敏电阻和电位器的电压、按键长短按判断。 本试题涉及模块较少&#xff0c;题目不难&#xff0c;基本上准备充分的都能完整的实现每一个功能&#xff0c;并…

fody引用c++的dll合并后提示找不到

fody引用c的dll合并后提示找不到 解决方案&#xff1a; 在 FodyWeavers.xml 文件中添加配置 CreateTemporaryAssemblies‘true’ 官方文档&#xff1a;https://github.com/Fody/Costura <Weavers xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:noN…

SpringBoot+Shiro开发登录认证功能

文章目录 一、项目背景二、页面效果三、仍然存在的问题总结四、代码前端Login.vue&#xff08;前端登录页&#xff09;system.js&#xff08;调用登录接口代码&#xff09;index.js&#xff08;配置拦截器处理逻辑&#xff09; 后端pom.xmlLoginControl.java&#xff08;登录接…

VUE2.0+elementUI+腾讯云点播上传视频

“vue”: “^2.6.11”, TcVod&#xff1a; “vod-js-sdk-v6”: “^1.7.0”, “element-ui”: “^2.15.6”, 直接上代码 上传视频加上传封面 在这里插入代码片 <template><div><p>上传封面</p><el-uploadclass"avatar-uploader"actio…