C++:C++的IO流
目录
一.C++标准IO流
1.operator bool
二.C++文件IO流
1.文件读取 ifstream
(1)ifstream继承istream
(2)ifstream 构造函数
(3)ifstream,get读取整个文件
(4)>> 读取文件
2.文件输入 ofstream
(1)ofstream继承ostream
(2)ofstream 构造函数
(3)拷贝文件 ifstream 搭配 ofstream
3.二进制读写
三.stringstream
1.用途:将 整形/自定义类型 转字符串
2.功能使用
(1)将数值类型数据格式化为字符串。
(2) 真正用法:自定义类型转字符串
(3) 字符串 转 自定义类型
箭头是子类继承,例如istream和ostream都继承ios,stream和ostream都是ios 子类;文件读写的ifstrem继承istream,ofstream继承ostream。
注意:他们用法相同,只是去向不同:istream去向是控制台;fstream去向是文件;sstringstream去向是string对象
一.C++标准IO流
while (scanf("%s", a) != EOF)如何终止? while (cin>>b)如何终止?
答:ctrl z+换行 是规定,ctrl c 是发送信号杀死进程(一般不建议ctrl c)。
int main()
{string str;while (cin >> str) // operator>>(cin, str){cout << str << endl;}char buff[128];while (scanf("%s", buff) != EOF){printf("%s\n", buff);}return 0;
}
cin >> str 和 scanf("%s", buff) 自定义类型无法做真假逻辑判断,那他们在while循环中是如何判断返回值的?——用operator bool
1.operator bool
operator bool:本质是为了支持自定义类型对象转换成bool类型,转换逻辑是自己设置的。(operator int 就是把自定义类型对象转换成int类型)
解释下面:operator bool() 这里是把Date对象转换成bool,返回值就是bool类型
operator char()这里把Date对象转换成char,返回值就是char类型
class Date
{
public:Date(int year,int month,int day):_year(year),_month(month),_day(day){}operator bool(){if (_year < 1000){return false;}else{return true;}}operator char(){return 'a';}private:int _year;int _month;int _day;
};int main()
{Date d1(999, 10, 20);Date d2(2024, 6, 5);bool ret1 = d1;//支持自定义类型对象转换成bool类型bool ret2 = d2;//会调用operator bool(),将d2传过去,进行判定返回cout << ret1 << endl;cout << ret2 << endl;Date d3(2324, 5, 6);char ch = d3;cout << ch << endl;return 0;
}
istream类型对象转换为逻辑条件判断值
实际上我们看到使用while(cin>>i)去流中提取对象数据时,调用的是operator>>,返回值是
istream类型的对象,那么这里可以做逻辑条件值,源自于istream的对象又调用了operator
bool,operator bool调用时如果接收流失败,或者有结束标志,则返回false。
#include<iostream>
#include<string>
#include<fstream>
#include<sstream>
using namespace std;
class Date
{friend ostream& operator << (ostream& out, const Date& d);friend istream& operator >> (istream& in, Date& d);
public:Date(int year = 1, int month = 1, int day = 1):_year(year), _month(month), _day(day){}// 支持Date对象转换成booloperator bool(){// 这里是随意写的,假设输入_year为0,则结束if (_year < 1)return false;elsereturn true;}
private:int _year;int _month;int _day;
};int main()
{Date d1 = -1;Date d2 = { 2022, 10, 11 };bool ret1 = d1; 支持自定义类型对象转换成bool类型bool ret2 = d2; 支持自定义类型对象转换成bool类型cout << ret1 << endl; 打印结果:0(false)cout << ret2 << endl; 打印结果:1(true)if (d1) 这里本质上也是调用了operator bool,d1的Date类型转成了bool类型去做判断{}return 0;
}
二.C++文件IO流
1.文件读取 ifstream
(1)ifstream继承istream
operator>>使用
int main()
{//在file.txt这个文件中存储了“asdf”char str[256];ifstream ifs("file.txt");ifs >> str; //将文件中的内容提到str中cout << str;
}
(2)ifstream 构造函数
①ifstream()
先创建一个无参的ifstream对象,再open打开响应文件。
②explicit ifstream (const char* filename, ios_base::openmode mode = ios_base::in);
直接传参:filename:文件名称。mode:打开方式,可以不传。(把filename中内容读取到ifstream对象中)
input从头开始读,output输出不是给ifstream用的,binary 打开图片视频等,at end 追加写,
(3)ifstream,get读取整个文件
get()每次读一个字符
#include<iostream>
#include<fstream>
using namespace std;int main()
{ifstream ifs("test1.txt");while (ifs){char ch = ifs.get();cout << ch;}return 0;
}
(4)>> 读取文件
>> 自动过滤空格和换行: >>认为空格/换行只是一个间隔,会自动忽略
#include<iostream>
#include<fstream>
using namespace std;int main()
{ifstream ifs("test1.txt");char ch[256];while (ifs>>ch){cout << ch;}return 0;
}
2.文件输入 ofstream
(1)ofstream继承ostream
operator<<使用
#include<iostream>
#include<fstream>
using namespace std;int main()
{char str[256] = "aaaaaa111112222";ofstream ofs("file.txt");ofs << str;return 0;
}
(2)ofstream 构造函数
①ofstream()
先创建一个无参的ofstream对象,再open打开响应文件。
②explicit ifstream (const char* filename, ios_base::openmode mode = ios_base::in);
直接传参:filename:文件名称。mode:打开方式,可以不传。(把filename中内容读取到ifstream对象中)
(3)拷贝文件 ifstream 搭配 ofstream
int main()
{//打开文件“读”ifstream ifs("test1.txt");//打开文件“存”ofstream ofs("file.txt");while (ifs){//一个一个的取字符char ch = ifs.get();ofs << ch;}return 0;
}
3.二进制读写
注意:二进制读写只能用数组,不能string,string是指针,进程A写入,进程B读取string时就是野指针;文本读写可以用string,WriteText 中调的流插入 ofs << info._address << endl; 调用了string的operator<<重载
#include<iostream>
#include<fstream>
using namespace std;struct ServerInfo
{char _address[256]; //这里只能用数组,不能string,string是指针,进程A写入,进程B读取string时就是野指针//string _address;int _port;
};struct ConfigManager
{
public:ConfigManager(const char* filename):_filename(filename){}void WriteBin(const ServerInfo& info){// 1 2 4 8 16ofstream ofs(_filename, ios_base::out | ios_base::binary); //打开一个文件ofs.write((const char*)&info, sizeof(info)); //向该文件写入 info的内容}void ReadBin(ServerInfo& info){ //把_filename文件读入ifs中,read把该文件内容读到info中去ifstream ifs(_filename, ios_base::in | ios_base::binary);ifs.read((char*)&info, sizeof(info));}
private:string _filename; // 配置文件
};int main()
{ServerInfo winfo = { "https://legacy.cplusplus.com/reference/ios/ios/eof/", 80 };//二进制写:ConfigManager cf_bin("test.bin"); //打开文件test.bin即可看到cf_bin.WriteBin(winfo); //因为是二进制写入,80整形被一个一个字节读到文件中就显示不出来 //二进制读:ServerInfo rbinfo;cf_bin.ReadBin(rbinfo);cout << rbinfo._address << " " << rbinfo._port << " ";return 0;
}
test.bin文件:(因为是二进制写入,80整形被一个一个字节读到文件中就显示不出来:
把test.bin文件中二进制的内容再二进制读出来的结果:
三.stringstream
stringstream 是 istringstream 和 ostringstream 的功能集合版,一般不使用stringstream,就直接用 istringstream 和 ostringstream 即可
1.用途:将 整形/自定义类型 转字符串
在 C 语言中,如果想要将一个整形变量的数据转化为字符串格式,如何去做?
1. 使用 itoa() 函数
2. 使用 sprintf() 函数
但是两个函数在转化时,都得 需要先给出保存结果的空间 ,那空间要给多大呢,就不太好界定,
而且 转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃 。
int main()
{int n = 123456789;char s1[32];_itoa(n, s1, 10);char s2[32];sprintf(s2, "%d", n);char s3[32];sprintf(s3, "%f", n);return 0;
}
2.功能使用
在C++中,可以使用stringstream类对象来避开此问题。
在程序中如果想要使用stringstream,必须要包含头文件。在该头文件下,标准库三个类:
istringstream、ostringstream 和 stringstream,分别用来进行流的输入、输出和输入输出操作,本文主要介绍stringstream。 stringstream主要可以用来:
(1)将数值类型数据格式化为字符串。
(整形转字符串类型没意义,to_string完全可以代替)
int main()
{int i = 1;double j = 1.11;ostringstream osm;osm << i <<" "<< j;string str = osm.str();cout << str << endl;return 0;
}
(2) 真正用法:自定义类型转字符串
#include<iostream>
#include<sstream>
using namespace std;class Date
{friend ostream& operator << (ostream& out, const Date& d);friend istream& operator >> (istream& in, Date& d);
public:Date(int year = 1, int month = 1, int day = 1):_year(year), _month(month), _day(day){}private:int _year;int _month;int _day;
};istream& operator >> (istream& in, Date& d)
{in >> d._year >> d._month >> d._day;return in;
}ostream& operator << (ostream& out, const Date& d)
{out << d._year << " " << d._month << " " << d._day;return out;
}int main()
{Date d(2024, 11, 9);ostringstream osm;osm << d;string str = osm.str();cout << str << endl;return 0;
}
oss<<d1 借助上面Date内部的 operator << ,就可以转成字符串
(3) 字符串 转 自定义类型
int main()
{string str("2024 11 9");Date d;istringstream ism(str);ism >> d;cout << d << endl;return 0;
}
相关文章:

C++:C++的IO流
目录 一.C标准IO流 1.operator bool 二.C文件IO流 1.文件读取 ifstream (1)ifstream继承istream (2)ifstream 构造函数 (3)ifstream,get读取整个文件 (4)>&g…...

「QT」几何数据类 之 QLine 整型直线类
✨博客主页何曾参静谧的博客📌文章专栏「QT」QT5程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…...
day58 图论章节刷题Part09(dijkstra(堆优化版)、Bellman_ford 算法)
dijkstra(堆优化版) 朴素版的dijkstra解法的时间复杂度为 O(n^2),时间复杂度只和 n(节点数量)有关系。如果n很大的话,可以从边的角度来考虑。因为是稀疏图,从边的角度考虑的话,我们在堆优化算法中最好使用…...
【计网不挂科】计算机网络期末考试——【选择题&填空题&判断题&简述题】试卷(1)
前言 大家好吖,欢迎来到 YY 滴计算机网络 系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 本博客主要内容,收纳了一部门基本的计算机网络题目,供yy应对期中考试复习。大家可以参考 本章是去答案版本。带答案的版本在下…...

智能出行助手:SpringBoot共享汽车管理平台
1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理共享汽车管理系统的相关信息成为必然。开发…...

【月之暗面kimi-注册/登录安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞 …...
Flink实现实时数据处理
代码如下: #!/usr/bin/python # -*- coding: UTF-8 -*-from pyflink.datastream import StreamExecutionEnvironment from pyflink.table import StreamTableEnvironment, EnvironmentSettings, DataTypes# 初始化执行环境 s_env StreamExecutionEnvironment.get_…...

11.9.2024刷华为
文章目录 HJ31 单词倒排HJ32 密码提取语法知识记录 傻逼OD题目又不全又要收费,看毛线,莫名奇妙 HW这叼机构别搁这儿害人得不得? 我觉得我刷完原来的题目 过一遍华为机考的ED卷出处,就行了 HJ31 单词倒排 游戏本做过了好像 HJ3…...
Chromium 中chrome.system.storage扩展接口定义c++
一、chrome.system.storage 您可以使用 chrome.system.storage API 查询存储设备信息,并在连接和分离可移动存储设备时收到通知。 权限 system.storage 类型 EjectDeviceResultCode 枚举 "success" 移除命令成功执行 - 应用可以提示用户移除设备。…...

【Qt聊天室客户端】登录窗口
1. 验证码 具体实现 登录界面中创建验证码图片空间,并添加到布局管理器中 主要功能概述(创建一个verifycodewidget类专门实现验证码操作) 详细代码 // 头文件#ifndef VERIFYCODEWIDGET_H #define VERIFYCODEWIDGET_H#include <QWidget>…...
如何显示模型特征权重占比图【数据分析】
可视化模型的特征权重 1、流程 1、导入库: numpy:用于处理数组和矩阵。 matplotlib.pyplot:用于绘图。 sklearn.datasets:用于加载数据集。 sklearn.ensemble.RandomForestClassifier:用于训练随机森林模型。2、加载数据集: 使用load_iris函数加载Iris数据集。3、训练模…...

Ubuntu24安装MySQL
下载deb包: 先更新系统包: sudo apt update sudo apt update -y下载mysql: wget https://dev.mysql.com/get/mysql-apt-config_0.8.17-1_all.deb 安装deb包: sudo dpkg -i mysql-apt-config_0.8.17-1_all.deb目前mysql还没有正式支持Ubun…...
微服务架构面试内容整理-Eureka
Spring Cloud Netflix 是一个为构建基于 Spring Cloud 的微服务应用提供的解决方案,利用 Netflix 的开源组件来实现常见的分布式系统功能。以下是 Spring Cloud Netflix 的一些主要组件和特点: 服务注册与发现:Eureka 是一个 RESTful 服务,用于注册和发现微服务。服务实例在…...

qt QErrorMessage详解
1、概述 QErrorMessage是Qt框架中用于显示错误消息的一个对话框类。它提供了一个简单的模态对话框,用于向用户显示错误或警告消息。QErrorMessage通常用于应用程序中,当需要向用户报告错误但不希望中断当前操作时。它提供了一个标准的错误消息界面&…...
SpringBoot 将多个Excel打包下载
在Spring Boot应用中,如果你需要将多个Excel文件打包成一个ZIP文件并提供下载,你可以使用一些Java库来帮助完成这个任务。这里我将展示如何使用Apache POI来生成Excel文件,以及使用Java.util.zip来创建ZIP文件,并通过Spring Boot的…...

分页存储小总结
知识点: 什么是分页存储? 将内存空间分为一个个大小相等的分区(比如:每个分区4KB),每个分区就是一个“页框”(页框页帧内存块物理块物理页面)。每个页框有一个编号,即“页框号”(…...

Star-CCM+应用篇之动力电池温度场仿真操作流程与方法
1 动力电池温度场仿真项目 电池包内模组温度分布、电芯温度分布、温升速率、充电时间等。 2 动力电池温度场仿真分析流程图 图1 电池包热流场分析流程 3 动力电池温度场仿真参数需求 类别...
Spring Boot应用开发:从入门到精通
Spring Boot应用开发:从入门到精通 Spring Boot是Spring框架的一个子项目,旨在简化Spring应用的初始搭建和开发过程。通过自动配置和约定大于配置的原则,Spring Boot使开发者能够快速构建独立的、生产级别的Spring应用。本文将深入探讨Sprin…...

【JAVA项目】基于jspm的【医院病历管理系统】
技术简介:采用jsp技术、MySQL等技术实现。 系统简介:通过标签分类管理等方式,实现管理员;个人中心、医院公告管理、用户管理、科室信息管理、医生管理、出诊信息管理、预约时间段管理、预约挂号管理、门诊病历管理、就诊评价管理、…...

Python中的常见配置文件写法
在软件开发过程中,开发者常常需要利用一些固定的参数或常量。对于这些相对恒定且频繁使用的元素,一种常见的做法是将它们集中存储在一个特定的文件中,以避免在多个模块代码中重复定义,从而维护核心代码的清晰度和整洁性。 具体而…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...