当前位置: 首页 > news >正文

C++ IO库

IO类

IO对象不能拷贝和赋值

iostream

表示形式的变化:

将100转换成二进制序列 然后格式化输出

x,y共用一块内存 输出的时候用不同的方式解析同一块内存

操作

格式化:内部表示转换为相应字节序列

缓存:要输出的内容放到缓存

编码转换:字符编码转换 utf8变长编码

传输:传输给外设

输入相反

封装特性

输入与输出

非格式化IO:不涉及数据任何形式的变化

格式控制

  • std::ios_base 是 C++ 标准库中定义基本输入输出流的类。
  • showposstd::ios_base 类中的一个标志,表示在输出正数时显示正号。
  • std::cout.setf() 用于设置格式标志,将 showpos 标志设置为 std::cout 的格式掩码中,以启用显示正号的功能。
  • std::cout.width() 是 C++ 标准库中用于设置输出宽度的成员函数。它是 std::ostream 类的成员函数,用于影响后续输出的格式。这个函数接受一个整数参数,指定输出字段的宽度,以确保输出的内容在指定的宽度内。如果输出的内容长度不足 10 个字符,将在左侧用空格进行填充
  • std::cout.fill() 是 C++ 标准库中用于设置填充字符的成员函数。它是 std::ostream 类的成员函数,用于指定在宽度设置时所使用的填充字符。填充字符是用于在输出字段宽度不足时进行填充的字符。
#include<iostream>int main(){char x='1';std::cout.setf(std::ios_base::showpos);  //开启正号std::cout<<x<<std::endl;  int y=static_cast<int>(x);std::cout<<y<<std::endl;return 0;
}

操纵符

std::setw(int n) 设置字段宽度,影响后续输出的宽度。

std::setprecision(int n) 设置输出流的浮点数精度。

std::setiosflags(std::ios_base::fmtflags flags) 设置一组格式标志。

"格式提取"(format extraction)

通常指的是从输入流中读取特定格式的数据。在C++中,常用的输入操作符(如>>)用于从输入流中提取数据,并根据期望的格式进行解析。

提取C风格字符串越界

解决方法使用setw

最后一个元素是\0

例题

#include<iostream>int main() {int i = 10;// 循环,从标准输入读取整数while (std::cin >> i, !std::cin.eof()) {// 检查是否发生了不可恢复的流错误if (std::cin.bad()) {throw std::runtime_error("cin is corrupted");}// 检查是否发生了格式错误(例如用户输入的不是整数)if (std::cin.fail()) {// 清除流的错误标志std::cin.clear();// 忽略输入缓冲区中的剩余字符,直到遇到换行符为止std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');std::cout << "data format error, please try again" << std::endl;continue;}std::cout << i << std::endl;}return 0;
}

文件流与文件操作

文件流对象

文件流处于打开就无法再次打开(C++规定) 只有打开才能IO

#include <iostream>
#include <fstream>int main() {// 打开名为 "myfile" 的文件,创建一个输入文件流对象 inFilestd::ifstream inFile("myfile");// 声明一个字符串变量 x,用于存储从文件中读取的内容std::string x;// 从文件中读取一个字符串,并将其存储到变量 x 中inFile >> x;// 输出 "hello" 到标准输出流(控制台)std::cout << "hello\n";// 关闭文件流(自动在程序结束时关闭,但显式关闭是一种好的实践)inFile.close();return 0;
}

检测是否打开的函数(检测流是否与文件关联)

打开文件:构造函数 ,或者open

关闭文件:析构函数 或者close

文件流的打开模式

每种文件流都有缺省打开方式

ate与app区别

ate开始位于文件末尾 但可以移动文件指针改变位置

app不能改变一直在文件末尾

例题

//让客户输入文件名称,如果文件不存在,就让客户重新输入文件名称,
//如果文件存在,就将文件全部内容输出。

#include<iostream>
#include<fstream>
#include <string>int main(){
//让客户输入文件名称,如果文件不存在,就让客户重新输入文件名称,
//如果文件存在,就将文件全部内容输出。std::string fileName;std::string fileContent;while(std::cin>>fileName,!std::cin.eof()){if(std::cin.bad()){throw std::runtime_error("cin is corrupted");}std::ifstream ifs(fileName);if(ifs){while(std::getline(ifs,fileContent)){std::cout<<fileContent<<std::endl;}if(ifs.bad()){throw std::runtime_error("ifs is corrupted");}ifs.close();}else{ifs.clear();ifs.ignore(std::numeric_limits<std::streamsize>::max(),'\n' );std::cout<<"file not exist,please try again"<<std::endl;continue;}}return 0;
}

内存流(stringstream)

在 C++ 中,内存流是一种特殊的流,它不与文件直接关联,而是与内存缓冲区关联。主要的内存流类是 std::istringstream(用于输入操作)和 std::ostringstream(用于输出操作),它们都是基于 std::iostream 类的。

1. std::istringstream(输入内存流):

2. std::ostringstream(输出内存流):

#include <iostream>
#include <sstream>int main() {// 创建一个输出内存流对象 obj1std::ostringstream obj1;// 将整数 1234 写入内存流obj1 << 1234;// 获取内存流中的字符串std::string res = obj1.str();// 输出字符串结果到标准输出std::cout << res << std::endl;  // 输出:1234// 创建一个输入内存流对象 obj2std::istringstream obj2;int x;// 试图从内存流中读取整数obj2 >> x;return 0;
}

1. std::ostringstream::str()

std::ostringstream 中,str() 函数返回内存流中的字符串,即当前流中的内容。它允许你将输出到内存流的数据以字符串的形式获取。

2. std::istringstream::str()

std::istringstream 中,str() 函数返回内存流中的字符串,即当前流中的内容。不过,对于 std::istringstreamstr() 函数返回的是从当前读取位置到流末尾的剩余部分的字符串。

作用:

基于字符串流的拼接优化操作

数据转换

string转换为int

#include<iostream>
#include<sstream>
#include<fstream>
#include <string>int main(){std::string str("12");std::stringstream strStream(str);int i=0;strStream>>i;if(strStream.bad()){throw std::runtime_error("strStream is corrupted");}else if(strStream.fail()){strStream.clear();strStream.ignore(std::numeric_limits<std::streamsize>::max(),'\n' );std::cout<<"string format error"<<std::endl;}else{std::cout<<i<<std::endl;}return 0;
}

int转换为string

#include<iostream>
#include<sstream>
#include<fstream>
#include <string>int main(){int i=100;std::stringstream str;str<<i<<std::endl;if(str.bad()){throw std::runtime_error("str is corrupted");}else{std::cout<<str.str()<<std::endl;}return 0;
}

用于对空格分隔的字符串的切分

#include<iostream>
#include<sstream>
#include<fstream>
#include <string>int main(){std::string src("hello word");std::string des;std::stringstream str(src);while(str>>des){std::cout<<des<<std::endl;}if(str.bad()){throw std::runtime_error("str is corrupted");}return 0;
}

流的状态

badbit

  • badbitstd::ios_base 类的成员之一,用于表示底层流发生了严重错误的标志。

  • badbit 被设置时,表示底层流已经处于无法恢复的错误状态,通常涉及到底层设备或文件的严重故障。

  • 如果 badbit 被设置,流的状态会变为 bad,可以通过调用 std::ios_base::bad() 函数检查。

failbit

  • failbitstd::ios_base 类的成员之一,用于表示流操作失败的标志。

  • failbit 被设置时,表示流的操作没有按照预期执行,可能包括格式错误或类型转换失败等。

  •  如果 failbit 被设置,流的状态会变为 fail,可以通过调用 std::ios_base::fail() 函数检查。

复位流状态

捕获流异常

流的定位

获取流位置

tellg 是 C++ 中输入流(std::istream)的成员函数,用于获取当前读取位置的位置指针(stream position indicator)的位置。它返回一个表示位置的整数类型,通常是 std::streampos

tellp 是 C++ 中输出流(std::ostream)的成员函数,用于获取当前写入位置的位置指针(stream position indicator)的位置。它返回一个表示位置的整数类型,通常是 std::streampos

设置流位置

seekg 是 C++ 中输入流(std::istream)的成员函数,用于设置当前读取位置的位置指针(stream position indicator)。这个函数允许你在输入流中移动位置,以便在需要的时候从不同的位置读取数据。

seekp 是 C++ 中输出流(std::ostream)的成员函数,用于设置当前写入位置的位置指针(stream position indicator)。这个函数允许你在输出流中移动位置,以便在需要的时候从不同的位置写入数据

流的同步

sync 是 C++ 中 std::ostream 的成员函数,用于将缓冲区的内容刷新到关联的输出设备(例如文件)。在 C++ 的输出流中,数据通常首先被写入到缓冲区,然后通过 sync 函数将缓冲区的内容刷新到实际的输出设备。

unitbuf 是一个影响输出流缓冲行为的I/O流操纵符。具体而言,它设置流的 unitbuf 标志,这意味着在每次插入操作之后都会刷新缓冲区。

cout有缓冲区 cerr没有

基于绑定的同步(tie)

tie 是一个用于设置关联(或绑定)两个流的成员函数。这个函数是定义在 <iostream> 头文件中的。

输出流(如 std::cout)和输入流(如 std::cin)通常是独立的,它们各自维护自己的缓冲区。然而,有时候你可能希望确保在读取输入之前或在输出后,缓冲区被刷新,以确保数据的正确同步。这时候,tie 就可以派上用场。

tie 的作用是将一个流与另一个流关联,从而在关联的流执行某些操作时,另一个流的缓冲区会被刷新。通常,tie 绑定的是输入流和输出流。

与C语言标准IO库同步

sync_with_stdio 是一个用于控制 C 标准输入输出库(stdio)的函数,用于设置 C 标准输入输出库的缓冲同步状态。这个函数的原型通常在头文件 <stdio.h> 中声明。

sync_with_stdio 接受一个整数参数 sync,如果 sync 的值为非零(例如,传入 1),则表示启用缓冲同步;如果 sync 的值为零,则表示禁用缓冲同步。缓冲同步是指标准输入(stdin)、标准输出(stdout)、标准错误输出(stderr)的缓冲同步状态

在这个示例中 关闭了同步 输出结果只要是a在c前面就是对的 b不一定

代码

#include<iostream>
#include<fstream>
#include <string>int main(){
//让客户输入文件名称,如果文件不存在,就让客户重新输入文件名称,
//如果文件存在,就将文件全部内容输出。std::string fileName;std::string fileContent;while(std::cin>>fileName,!std::cin.eof()){if(std::cin.bad()){throw std::runtime_error("cin is corrupted");}std::ifstream ifs(fileName);if(ifs){while(std::getline(ifs,fileContent)){std::cout<<fileContent<<std::endl;}if(ifs.bad()){throw std::runtime_error("ifs is corrupted");}ifs.close();}else{ifs.clear();ifs.ignore(std::numeric_limits<std::streamsize>::max(),'\n' );std::cout<<"file not exist,please try again"<<std::endl;continue;}}return 0;
}

相关文章:

C++ IO库

IO类 IO对象不能拷贝和赋值 iostream 表示形式的变化&#xff1a; 将100转换成二进制序列 然后格式化输出 x,y共用一块内存 输出的时候用不同的方式解析同一块内存 操作 格式化&#xff1a;内部表示转换为相应字节序列 缓存&#xff1a;要输出的内容放到缓存 编码转换&…...

Springboot 项目关于版本升级到 3.x ,JDK升级到17的相关问题

由于spring 停止对2.x 版本的维护&#xff0c;以及 jdk 频繁发布等客观因素&#xff0c;现需要对已有springboot 工程做一次全面升级&#xff1b;已因对市面上第三方等依赖库的兼容问题&#xff1b; 现有工程使用哥技术栈是版本&#xff1a; freemarker &#xff1a;2.3.32 spr…...

QGraphicsView实现简易地图7『异步加载-多瓦片-无底图』

前文链接&#xff1a;QGraphicsView实现简易地图6『异步加载-单瓦片-无底图』 前一篇文章提到的异步单瓦片加载&#xff0c;是指线程每准备好一个瓦片数据后&#xff0c;立刻抛出信号让主线程加载。而本篇异步多瓦片加载是指线程准备好所有瓦片数据后&#xff0c;一起抛出信号让…...

Spring Boot学习(三十三):集成kafka

前言 下面是zookeeper和kafka的官网下载地址&#xff0c;大家可以学习下载 zookeeper下载地址&#xff1a;http://zookeeper.apache.org/releases.html kafka下载地址&#xff1a;http://kafka.apache.org/downloads.html 1、添加依赖 在 pom.xml 文件中添加kafka依赖&am…...

MOSFET

MOSFET 电子元器件百科 文章目录 MOSFET前言一、MOSFET是什么二、MOSFET类别三、MOSFET应用实例四、MOSFET作用原理总结前言 MOSFET是一种常见的半导体器件,通过栅极电场控制通道区的导通特性,以控制电流流动。它在现代电子电路中发挥着重要的作用,并广泛应用于各种应用领域…...

DriveWorks——参数化设计非标定制利器

DriveWorks基本介绍 DriveWorks是一套被 SOLIDWORKS 认可为金牌合作伙伴产品的设计自动化软件。DriveWorks 可自动创建特定于订单的销售文档和 SOLIDWORKS 制造数据。减少重复性任务&#xff0c;消除错误&#xff0c;增加销售额&#xff0c;并在创纪录的时间内交付定制产品。 为…...

DevEco Studio集成ArkUI-X

语雀知识库地址&#xff1a;语雀HarmonyOS知识库 飞书知识库地址&#xff1a;飞书HarmonyOS知识库 在上篇文章(HarmonyOS应用开发工具DevEco Studio安装与使用)中我说到官方推出了4.0 Beta版本的IDE&#xff0c;这篇文章就来介绍这个版本的安装与使用 该版本集成了HarmonyOS多…...

网络视频服务器的作用是什么?

随着互联网的快速发展和网络带宽的提升&#xff0c;网络视频已经成为人们日常生活中不可或缺的一部分。网络视频服务器作为支持和传输网络视频的关键基础设施&#xff0c;发挥着重要的作用。本文将以网络视频服务器的作用为方向&#xff0c;探讨其在现代社会中的重要性。 首先…...

解决vue3使用iconpark控制台预警提示问题

前言 最近在项目中使用 iconpark-icon 来管理图标&#xff0c;一切都很顺利&#xff0c;引入链接后&#xff0c;图标正常显示&#xff0c;没有报错。但是控制台却发出了预警信息。 [Vue warn]: Failed to resolve component: iconpark-icon If this is a native custom eleme…...

VMware 虚拟机 NAT 模式网络配置

配置的核心点在于 网关要一致&#xff0c;才能访问外网 比如下面的网关都是&#xff1a;192.168.145.2 问题总结&#xff1a; 当时重启电脑后如果连不上外网了&#xff0c;检查下 windows 服务中 NAT服务是否已经启动...

5-redis高级-哨兵

1 哨兵 1.1 python 操作哨兵 1 哨兵 # 主从---》一主多从-主库用来写-从库用来读-主库挂了--》整个系统就不能写数据了#主从复制存在的问题&#xff1a;1 主从复制&#xff0c;主节点发生故障&#xff0c;需要做故障转移&#xff0c;可以手动转移&#xff1a;让其中一个slave变…...

鸿蒙HarmonyOS4.0开发应用学习笔记

黑马程序员鸿蒙4.0视频学习笔记&#xff0c;供自己回顾使用。1.安装开发工具DevEco Studio 鸿蒙harmony开发文档指南 DevEco Studio下载地址 选择或者安装环境 选择和下载SDK 安装总览 编辑器界面 2.TypeScript语法 2.1变量声明 //string 、number、boolean、any、u…...

联通宽带+老毛子Padavan固件 开启IP v6

联通宽带开启IP v6 参考&#xff1a; 联通宽带开启 IPV6 的方法_联通ipv6怎么开通-CSDN博客 个人宽带如何开启IPv6网络访问 - 知乎 (zhihu.com) 首先&#xff0c;你要确定当前你所在的地区运营商已经开通了IPV6&#xff0c;可以使用手机流量 IP查询(ipw.cn) | IPv6测试 | IPv…...

唯创知音WT2003Hx系列单片机语音芯片:家庭理疗产品的智能声音伴侣

随着科技的不断创新&#xff0c;家庭理疗产品正迎来一场智能化的变革。唯创知音的WT2003Hx系列单片机语音芯片以其强大的功能和高品质音频播放能力&#xff0c;为家庭理疗产品带来了更为智能、沉浸式的用户体验。 1. MP3高品质音频播放 WT2003Hx系列语音芯片支持高品质的MP3音…...

2023_Spark_实验二十七:Linux中Crontab(定时任务)命令详解及使用教程

Crontab介绍&#xff1a; Linux crontab是用来crontab命令常见于Unix和类Unix的操作系统之中&#xff0c;用于设置周期性被执行的指令。该命令从标准输入设备读取指令&#xff0c;并将其存放于“crontab”文件中&#xff0c;以供之后读取和执行。该词来源于希腊语 chronos(χρ…...

Java动态代理实现与原理详细分析

Java动态代理实现与原理详细分析 关于Java中的动态代理&#xff0c;我们首先需要了解的是一种常用的设计模式–代理模式&#xff0c;而对于代理&#xff0c;根据创建代理类的 时间点&#xff0c;又可以分为静态代理和动态代理。 1、代理模式 代理模式是常用的java设计模式&…...

[实践总结] 使用Apache HttpClient 4.x进行进行一次Http请求

使用Apache HttpClient 4.x进行进行一次Http请求 依赖 <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --> <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactI…...

易宝OA 两处任意文件上传漏洞复现

0x01 产品简介 易宝OA系统是一种专门为企业和机构的日常办公工作提供服务的综合性软件平台,具有信息管理、 流程管理 、知识管理(档案和业务管理)、协同办公等多种功能。 0x02 漏洞概述 易宝OA系统UploadFile、BasicService.asmx等接口处存在文件上传漏洞,未授权的攻击者可…...

echart饼图高亮颜色设置,数据为0时候,labelLine不显示

鼠标移上去高亮&#xff0c;颜色变浅&#xff0c;希望不改变颜色 在series.data中为各项设置itemStyle&#xff0c;官方设置不生效&#xff0c;不知原因&#xff0c;可能版本问题 itemStyle: {normal: { color: #DFEAFF, },emphasis: { color: #DFEAFF }},数据为0时候显示饼图…...

Kafka 的消息格式:了解消息结构与序列化

Kafka 作为一款高性能的消息中间件系统&#xff0c;其消息格式对于消息的生产、传输和消费起着至关重要的作用。本篇博客将深入讨论 Kafka 的消息格式&#xff0c;包括消息的结构、序列化与反序列化&#xff0c;以及一些常用的消息格式选项。通过更丰富的示例代码和深入的解析&…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...