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中的常见配置文件写法
在软件开发过程中,开发者常常需要利用一些固定的参数或常量。对于这些相对恒定且频繁使用的元素,一种常见的做法是将它们集中存储在一个特定的文件中,以避免在多个模块代码中重复定义,从而维护核心代码的清晰度和整洁性。 具体而…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...