C++知识点总结全系列 (05):IO 类的详细总结和分析

news2024/11/18 14:32:50

1、基类 istream 和 ostream

(1)istream

A.What

输入流的抽象类,是所有输入流类的基类

B.Why(输入流的作用)

用于从数据源(如文件、标准输入设备等)读取数据

(2)ostream

A.What

输出流的抽象类,是所有输出流类的基类

B.Why(输出流的作用)

输出流用于将数据写入到目标位置,例如文件或标准输出设备(通常是屏幕)

(3)输入输出流的状态

A.Which

goodbit:表示流处于正常状态,可以进行正常的输入和输出
eofbit:表示已经到达文件末尾或流的结束位置,当文件读取完毕时,eofbit会被设置为1
failbit:表示流操作失败,如尝试将字符写入只读文件、尝试从空文件中读取数据
badbit:表示流已经崩溃或数据出现问题,如打开不存在的文件、内存不足等

stream.good();
stream.eof();
stream.fail();
stream.bad();

B.How(如何操作流状态)

获取流的状态:stream.rdstate()

if(istream.rdstate() & std::ios_base::badbit)
{ 
	std::cout<<"badbit error!"<<std::endl;
}

复位流状态位:goodbit设置为1,其它设置为0

istream.clear();

设置指定状态位:但 stream.setstate(goodbit)不合法

istream.setstate(std::ios_base::failbit | std::ios_base::eofbit);

2、派生类fstream

(1)fstream

A.What

C++ 标准库中用于文件输入输出操作的文件流类

B.Why

实现对文件的输入和输出操作

C.文件打开方式

模式说明
in以读的方式打开文件
out以写的方式打开文件,写数据后原文件将被覆盖
out | trunc当以 trunc 模式打开文件时,如果该文件存在, 则先清空,后写入新数据。如果文件不存在,则创建
out | app每次写操作均定位到文件末尾
binary二进制形式打开文件(in&out)
ate打开文件后立即定位到文件末尾(in&out)

(2)ifstream

A.What

文件输入流类,是istream的派生类

B.Why

用于实现从文件中读取数据

C.How

std::string strFilePth = "D:\\Desktop\\a.txt";
// 以读的方式打开文件
std::ifstream inStream;
inStream.open(strFilePth);
if (!inStream.is_open())
{
	std::cerr << "Failed to open file" << std::endl;
	return;
}
char ch[10];
while (inStream.read(ch, 10))
{
	
	std::cout << ch << std::endl;
}
inStream.close();

(3)ofstream

A.What

文件输出流类,是ostream的派生类

B.Why

用于向文件中写入数据

C.How

std::string strFilePth = "D:\\Desktop\\a.txt";
// 以写的方式打开文件
std::ofstream outStream;
outStream.open("D:\\Desktop\\a.txt", std::ios_base::app);
if (!outStream.is_open())
{
	std::cerr << "Failed to open file" << std::endl;
	return;
}
// 向文件中写入数据
int i = 0;
while (!outStream.eof())
{
	outStream << "wodeshijie" << std::endl;
	++i;
	if (i >= 10)
	{
		outStream.setstate(std::ios_base::eofbit);
		
	}
}
outStream.close();

3、流缓冲

(1)What(什么是流缓冲)

本质是一个内存中的缓冲区,每个输入或输出流对象都管理一个缓冲区,用来保护读写数据

(2)刷新缓冲

将数据真正写入到文件或输出设备中

(3)When(什么时候刷新缓冲)

  • 程序正常结束时
  • 缓冲区满时
  • 使用操作符endl、ends、flush时:flush表示主动刷新缓冲区
  • 一个流关联到另一个流时:

如默认情况下 cin 和 cerr 都关联到 cout,因此读 cin 或写 cerr 都会导致 cout 的缓冲区被刷新

4、格式化输入和输出

(1)What

标准库定义了一组操纵符(本质是函数或对象)来修改流的格式状态 当操作符改变流的格式状态时,通常改变后的状态对所有后续 IO 都生效

(2)Which

A.控制布尔值的格式

bool bFlag = true;
std::cout<<std::boolalpha<<bFlag<<std::endl; //打印:true
std::cout<<std::noboolalpha<<bFlag<<std::endl; //打印:1

B.控制整型值进制的格式

cout<<"default:"<<20<<" "<<1024<<endl;
cout<<"octal:"<<oct<<20<<" "<<1024<<endl;
cout<<"hex:"<<hex<<20<<" "<<1024<<endl;
cout<<"decimal:"<<dec<<20<<" "<<1024<<endl;

输出结果:
default:20 1024
octal:24 2000
hex:14 400
decimal:20 1024

C.控制浮点数的格式

// 浮点数格式 
double a = 12.123456789; 
cout << cout.precision() << endl; // 打印:6 (默认精度为 6) 
cout << a << endl; // 打印:12.1235
// 浮点数精度设置——precision
cout.precision(12); cout << a << endl; // 打印:12.123456789
// 是否显式为 0 的小数——showpoint noshowpoint(默认) double b = 12.000000;
cout << b << endl; // 打印:12 
cout << std::showpoint << b << endl; // 打印:12.000000 
// 科学计数格式——scientific
double c = 123456.123456; 
cout << std::scientific << c << endl; // 打印:1.234561234560e+05

4、非格式化输入和输出

(1)What

主要是使用流对象函数实现输入和输出

(2)单字节操作

在这里插入图片描述

char ch; while (cin.get(ch))
{
cout.put(ch); }int ch;
while ((ch = cin.get()) != EOF)
{
}
cout.put(ch)

(3)多字节操作

在这里插入图片描述

// 输入流对象函数使用:get(char_arr,max_len,delim) 
instream.clear();
cout << instream.tellg() << endl; // 打印:247 
instream.seekg(0, std::ios::beg); // 设置流的当前指针 
cout << instream.tellg() << endl; // 打印:0
const int MAX_LEN = 1000; char wch[MAX_LEN]; // 应该比读取的最大长度要大 
instream.get(wch, MAX_LEN, '\0'); // 读取最大长度为 MAX_LEN 的字符 
cout << wch << endl; // 打印:所有文本
// 输入流对象函数使用:getline(char_arr,max_len,delim) 
instream.clear();
instream.seekg(0, std::ios::beg);
char ch_arr02[MAX_LEN];
instream.getline(ch_arr02, MAX_LEN, '\0'); 
cout << ch_arr02 << endl;
// 输入流对象函数使用:read (char_arr,max_len) 
instream.clear();
instream.seekg(0, std::ios::beg); 
char ch_arr03[MAX_LEN];
instream.read(ch_arr03, MAX_LEN / 5); 
cout << instream.gcount() << endl; // 打印:200 
cout << instream.tellg() << endl; // 打印:208 
cout << ch_arr03 << endl;

(4)流的随机访问

在这里插入图片描述

instream.clear(); instream.seekg(0, std::ios::beg); 
for (int i = 0; i < MAX_LEN; ++i) {
	instream >> std::noskipws >> ch; 
	if (instream.fail()) break;
	instream.seekg(i); cout << ch;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重温react-09(高阶组件的使用方式和注意事项)

高阶组件 可以理解为vue的混入吧&#xff0c;但是没有那个方便&#xff08;个人见解&#xff09; 挂载的全局App.jsx的代码 import React from react; import LearnFunction05 from ./LearnFunction05; // 这个是高阶函数的用法 export default function boxReact() {retur…

六西格玛绿带培训的证书有什么用处?

近年来&#xff0c;六西格玛作为一套严谨而系统的质量管理方法&#xff0c;被广泛运用于各行各业。而六西格玛绿带培训证书&#xff0c;作为这一方法论中基础且重要的认证&#xff0c;对于个人和企业而言&#xff0c;都具有不可忽视的价值。本文将从多个角度深入探讨六西格玛绿…

你敢相信吗,AI绘画正在逐渐取代你的工作!

前言 在当今信息技术高速发展的时代&#xff0c;AI绘画技术的崛起已引起了广泛关注和讨论。许多人开始担心AI技术是否会逐渐取代传统绘画师的工作。人类无疑是感性的动物&#xff0c;创作出来的艺术作品常常带有浓郁的个人风格和情感。但AI绘画在某些方面的突破&#xff0c;使…

浅谈定时器之泊松随机定时器

浅谈定时器之泊松随机定时器 “泊松随机定时器”(Poisson Random Timer)&#xff0c;它允许你基于泊松分布来随机化请求之间的延迟时间&#xff0c;这对于模拟具有随机到达率的事件特别有用&#xff0c;如用户访问网站或服务的请求。 泊松分布简介 泊松分布是一种统计与概率…

大厂面试官问我:在同步binlog的时候主库是一个时间,从库是一个时间,底层是怎么解决的?【后端八股文八:Mysql日志八股文合集(2)】

本文为【Mysql日志八股文合集&#xff08;2&#xff09;】初版&#xff0c;后续还会进行优化更新&#xff0c;欢迎大家关注交流~ 大家第一眼看到这个标题&#xff0c;不知道心中是否有答案了&#xff1f;在面试当中&#xff0c;面试官经常对项目亮点进行深挖&#xff0c;来考察…

国产压缩包工具——JlmPackCore SDK说明(二)——JlmPack_Create函数说明

一、JlmPack_Create函数说明 JlmPack_Create函数是创建jlm压缩文件的核心函数&#xff0c;最大允许CATALOG_MAX_LIMIT&#xff08;请参考Config.h&#xff09;个目录&#xff0c;意思是包括文件夹和文件在内&#xff0c;遍历整个列表最大允许CATALOG_MAX_LIMIT个目录对象&#…

Zabbix HA高可用集群部署

Zabbix HA高可用集群介绍 关键基础设施通常需要高可用性 (HA)&#xff0c;因为这些基础设施几乎不会造成停机。因此&#xff0c;对于任何可能失败的服务&#xff0c;都必须有一个故障转移选项&#xff0c;以便在当前服务失败时接管。 Zabbix 提供了易于设置的本机高可用性解决…

智慧渔港:海域感知与岸线监控实施方案(智慧渔港渔船综合管控平台)

文章目录 引言I 技术栈1.1 物理结构图1.2 功能逻辑结构图II 云台(大华)2.1 设备网络SDK运行在Mac平台2.2 WEB无插件开发包III 术语3.1 渔业引言 利用渔船现有的定位导航通讯设备等资源,实现岸线和近岸海域内违法船舶和可疑船舶预警、抓拍、跟踪和行为分析。 在渔船上安装风…

2024百元蓝牙耳机哪个好?2024性价比最高的蓝牙耳机推荐

2024想要在百元左右找到一款好用的性价比高的蓝牙耳机&#xff0c;确实是个不小的挑战。市场上各种耳机品牌和型号琳琅满目&#xff0c;各有各的特点。你可能会疑惑&#xff0c;如何才能在预算内挑选到一款性价比高、音质好的耳机呢&#xff1f;这篇文章将为你提供一些选购百元…

湖南省教育网络协会莅临麒麟信安调研教育网络数字化建设及教育信创发展情况

6月28日下午&#xff0c;湖南省教育网络协会理事长张智勇、秘书长刘志勇、副理事长黄旭、胡洪波、周中伟等协会相关负责人一行莅临麒麟信安&#xff0c;就湖南省教育网络数字化建设、教育信创工作等主题进行深入调研。麒麟信安副总裁王攀热情接待。 协会成员一行来到麒麟信安展…

1978Springboot在线维修预约服务应用系统idea开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot在线维修预约服务应用系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发 &#xff09;&#xff0c;系统具有完整的源代码和…

中国智能工厂自动化集成商100强:广东23家,江苏20家,上海浙江紧随其后

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 更多的海量【智能制造】相关资料&#xff0c;请到智能制造online知识星球自行下载。 在数字化、智能化的浪潮中&#xff0c;中国智能工厂自动化集…

下代iPhone或回归可拆卸电池,苹果这操作把我看傻了

刚度过一个愉快的周末&#xff0c;苹果又双叒叕摊上事儿了。 iPhone13 系列被曝扎堆电池鼓包了。 早在去年&#xff0c;就有 iPhone13 和 iPhone14 用户反馈过类似的问题&#xff0c;表示在手机仅仅使用了一年多的时间就出现了电池鼓包的情况&#xff0c;而且还把屏幕给撑起来了…

SAP Build 3-调用SAP BAPI和调用S4HC API

1. 调用SAP BAPI 1.1 前提 项目已创建 SAP环境登录正常 1.2 引入BAPI SDK 商店中下载BAPI SDK Process中导入BAPI SDK 1.3 新建action group 新建action group时&#xff0c;会要求填写SAP登录信息&#xff0c;根据连接类型分为SSO&#xff0c;Basic和Custom 如果选择SS…

【办公软件使用分享—Word篇】实用技巧 一学就会 沈阳电脑办公软件基础培训

在平时的工作学习中&#xff0c;Word真真是让很多人头疼的一件事&#xff0c;今天给大家分享20个案例&#xff0c;感受下Word真正的力量&#xff01; 1.插入自动目录 没有目录的文档不是一份合格的文档&#xff0c;很多人认为在Word里插入目录是一件很麻烦的事&#xff0c;其…

Soul打造安全社交元宇宙环境,全力守护用户线上社交安全

在数字化时代的浪潮中,智能安全线上社交正成为人们日常生活中的重要组成部分。随着人们对社交媒体和在线平台依赖程度的不断增加,保障个人信息安全和网络安全变得至关重要。在此背景下,社交平台致力于采取多种措施来保障用户的隐私安全,提升社交体验的质量和安全性。而Soul全方…

Linux[高级管理]——Squid代理服务器的部署和应用(反向代理详解)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f468;‍&#x1f4bb;Linux高级管理专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月24日11点11分 &#x1f004;️文章质量&#xff1a;95分 目录 ————前言———— Squid的几种模式…

高效的向量搜索算法——分层可导航小世界图(HNSW)

最近在接触大模型相关内容&#xff0c;发现一种高效的向量搜索算法HNSW&#xff0c;这里做一下记录。 在之前自己也接触过一段时间的复杂网络&#xff08;网络科学&#xff09;&#xff0c;没想到&#xff0c;将网络科学的思想引入到向量搜索算法中&#xff0c;可以产生令人眼前…

植物大战僵尸杂交版手机下载与安装全攻略

植物大战僵尸杂交版是一款深受玩家喜爱的策略冒险游戏&#xff0c;以其丰富的植物种类、多样的关卡设计和趣味的玩法著称。本文将为您提供详细的下载与安装教程&#xff0c;帮助您快速上手&#xff0c;享受游戏带来的乐趣。 游戏简介 植物大战僵尸杂交版在传统玩法的基础上&a…

C++修饰符类型

一、存储类运算符 auto&#xff08;自动存储类&#xff0c;但在现代C中&#xff0c;它通常用于自动类型推导&#xff09; register&#xff08;建议编译器将变量存储在寄存器中&#xff0c;但现代编译器通常忽略此关键字&#xff09; static&#xff08;静态存储类&#xff…