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中的常见配置文件写法
在软件开发过程中,开发者常常需要利用一些固定的参数或常量。对于这些相对恒定且频繁使用的元素,一种常见的做法是将它们集中存储在一个特定的文件中,以避免在多个模块代码中重复定义,从而维护核心代码的清晰度和整洁性。 具体而…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
