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

C++中的流

前言

        在 C++ 中,流(stream)是一种数据传输的抽象概念,用于在程序中对输入和输出进行操作。流分为输入流和输出流,允许数据在程序和外部设备(如键盘、屏幕、文件)之间进行传输。输入流用于从外部获取数据,输出流用于向外部发送数据。C++ 中的流由标准库提供支持,主要包括 iostreamifstreamofstreamsstream 等类。流以流插入运算符 << 和流提取运算符 >> 来进行数据的输入和输出操作。流提供了一种便捷的方式来进行输入输出操作,使得程序可以与用户进行交互,同时还可以读写文件和其他外部设备 。               

一、C++流的概念

1.C++流的体系结构

        C++ 的流体系结构是由标准库提供的,主要包括输入流和输出流两个方面。流可以与各种数据源进行交互,包括标准输入输出设备(如键盘和屏幕)、文件、字符串等。下面是 C++ 流的主要组成部分:

  1. 输入流(istream):输入流用于从外部数据源(如键盘、文件)中读取数据到程序中。istream 是输入流的基类,它提供了从流中读取数据的接口,包括提取运算符 >>getline() 等。

  2. 输出流(ostream):输出流用于将程序中的数据输出到外部数据源(如屏幕、文件)。ostream 是输出流的基类,它提供了将数据写入流的接口,包括插入运算符 <<put() 等。

  3. 输入输出流(iostream)iostream 是 C++ 中最常用的流类,它同时继承了 istreamostream,提供了同时进行输入和输出操作的功能。

  4. 文件输入流(ifstream)ifstream 类继承自 istream,用于从文件中读取数据。

  5. 文件输出流(ofstream)ofstream 类继承自 ostream,用于向文件中写入数据。

  6. 字符串流(stringstream)stringstream 类继承自 iostream,用于在内存中创建一个字符串流,可以像流一样进行输入输出操作,但是数据存储在内存中的字符串中,而不是外部设备或文件。

这些流类组成了 C++ 中的流体系结构,为程序提供了灵活且强大的输入输出功能。通过这些流类,程序可以与用户进行交互,读写文件,以及进行其他各种输入输出操作。

2.预定义流对象

        C++ 中的预定义流对象是指在标准库中预先定义好的一些流对象,用于简化输入输出操作。这些预定义流对象通常是 cincoutcerrclog

  1. cincin 是标准输入流对象,通常用于从标准输入设备(如键盘)读取数据。

  2. coutcout 是标准输出流对象,通常用于向标准输出设备(如屏幕)输出数据。

  3. cerrcerr 是标准错误流对象,用于向标准错误设备输出错误信息。它与 cout 相似,但通常用于输出程序运行时的错误信息,而不是普通的输出。

  4. clogclog 是标准日志流对象,用于输出程序的运行时信息。它与 cerr 类似,但通常用于输出程序的日志信息,而不是错误信息。

这些预定义流对象使得输入输出操作变得更加方便和简洁,是 C++ 中常用的功能。通过这些流对象,可以方便地进行标准输入输出、错误输出以及日志输出。

3.提取运算符>>和插入运算符<<

         在 C++ 中,提取运算符 `>>` 和插入运算符 `<<` 是用于输入和输出操作的重要运算符。

1. **提取运算符 `>>`**:

   - 提取运算符 `>>` 用于从输入流中提取数据,并将提取的数据存储到指定的变量中。
   - 通常用于从标准输入流 `cin` 中读取用户输入的数据,或者从文件流等输入流中读取数据。
   - 语法:`istream_object >> variable;`
   - 示例:

int num;     

cin >> num; // 从标准输入流中读取一个整数,并将其存储到变量 num 中

2. **插入运算符 `<<`**:

   - 插入运算符 `<<` 用于将数据插入到输出流中,以便将数据输出到指定的输出设备(如屏幕、文件等)。
   - 通常用于向标准输出流 `cout`、标准错误流 `cerr`、日志流 `clog` 中输出数据,或者向文件流等输出流中输出数据。
   - 语法:`ostream_object << value;`
   - 示例:     

cout << "Hello, World!"; // 将字符串 "Hello, World!" 输出到标准输出流

        这些运算符使得输入输出操作变得简洁和直观,是 C++ 中常用的功能。通过这些运算符,可以方便地进行数据的输入和输出操作,无论是从标准输入流读取用户输入,还是向标准输出流输出结果。

4.有(无)格式输入/输出

        C++ 中的有格式输入/输出(formatted I/O)和无格式输入/输出(unformatted I/O)是两种不同的输入输出操作方式。

1. **有格式输入/输出**:
   - 有格式输入/输出是指根据指定的格式将数据进行输入和输出,以便进行格式化显示或格式化读取。
   - 有格式输出通常使用插入运算符 `<<` 和流控制符(如 `setw()`、`setprecision()` 等)来指定输出的格式。
   - 有格式输入通常使用提取运算符 `>>` 和格式化输入函数(如 `getline()`、`scanf()` 等)来按照指定格式读取数据。
   - 有格式输入/输出适用于需要按照特定格式输出或读取数据的场景,如输出表格、格式化的日期时间等。

2. **无格式输入/输出**:
   - 无格式输入/输出是指直接将数据按照原始形式进行输入和输出,不进行任何格式化处理。
   - 无格式输出通常使用插入运算符 `<<` 将数据输出到流中,不进行额外的格式化处理。
   - 无格式输入通常使用提取运算符 `>>` 将数据从流中提取出来,不进行额外的格式化处理。
   - 无格式输入/输出适用于简单的输入输出场景,如读取和写入二进制文件、网络数据传输等。

5.操作符

        C++ 中的操作符(operators)是用于执行特定操作的符号或关键字,它们可用于执行算术、逻辑、位操作等。

二、输入/输出的格式控制

1.默认的输入/输出格式

1.默认的输入格式

        C++ 中默认的输入格式通常是基于空白字符(空格、制表符、换行符等)来分隔不同的输入项。这意味着在使用输入操作符 >> 时,它会跳过输入流中的空白字符,并将其视为分隔符,从而将输入流中的数据分割为不同的输入项。

        如果我们使用以下代码从输入流中读取数据:

int a, b, c;
cin >> a >> b >> c;

        则 `cin` 会依次将 `10`、`20` 和 `30` 读取到变量 `a`、`b` 和 `c` 中。

        另外,`cin` 也会将换行符(回车)视为输入的结束符号,因此如果用户输入完数据后按下回车键,则输入操作会停止。

2.默认的输出格式

        C++ 中默认的输出格式通常是将数据按照其类型进行格式化输出,并使用空格将不同的输出项分隔开来。对于基本数据类型,如整数、浮点数、字符等,默认的输出格式是右对齐,并且小数点后保留 6 位有效数字。

2.格式标识与格式控制

1.setf 设置某个域中的标志,设置前先讲改域中的所有标识清除

实例代码如下:

cout.setf(ios_base::left,ios_base::adjustfield);

2.setf函数返回设置前的格式控制标志。  

cout.setf(ios_base::showpos);

3.unsetf此函数用于清除制定标志或域    

cout<<setiosflags(ios_base::showpos);

3.输入/输出宽度的设置

        在 C++ 中,您可以使用 setw() 和 setfill()函数来设置输入/输出的宽度。这两个函数通常与输出流对象一起使用,例如 `cout`、`cin` 等。

1. setw() 函数

        用于设置输出的字段宽度。设置后,后续的输出项将按照指定的宽度进行输出。如果输出项的长度小于指定的宽度,则用填充字符(默认为空格)填充,直到达到指定的宽度。

#include <iostream>
#include <iomanip>using namespace std;int main() {cout << setw(10) << "Hello"; // 输出宽度为 10 的字符串,不足部分用空格填充return 0;
}

   输出结果为:

      Hello

2. setfill() 函数

        用于设置填充字符。设置后,`setw()` 函数所指定的宽度不足时将使用指定的填充字符进行填充。

#include <iostream>
#include <iomanip>using namespace std;int main() {cout << setw(10) << setfill('-') << "Hello"; // 输出宽度为 10,填充字符为 '-' 的字符串return 0;
}

   -----Hello

4.浮点数输出方式的控制

        在 C++ 中,您可以使用 `setprecision()` 和 `fixed` 控制符来控制浮点数的输出方式,包括小数位数和输出格式。

1. fixed:浮点数按定点格式输出。

2. secientific:浮点数按照指数格式输出

5.输出精度的控制

        输入/输出精度是针对浮点数控制的,其实际含义与浮点输出方式有关。如果是浮点类型,精度指的是有效位数。如果是指数格式,精度的含义是小数位数。精度的设置默认为6.setprecision函数设置精度。

6.对齐方式的控制

1.left左对齐

2.right右对齐

3.internal设定的宽度内右对齐输出,但是如果有符号,符号位于最左端。

7.小数点处理方式的控制

        这个设置只影响浮点格式输出的浮点数据。初始状态下,不输出小数点以及小数点后的无效0;设置之后小数点点处理方式一直有效,知道再次设置小数点处理方式为止。

        有关操作符如下。

        showpoint:输出小数点以及后面的0

        noshowpoint:不输出无效的0

        实例代码如下:

#include <iostream>
#include <iomanip>using namespace std;int main() {float f = 123;cout<<right<<showpoint<<setprecision(4)<<setw(20)<<f<<endl;//cout<<noshowpoint<<setw(20)<<f<<endl;//设置字符A填充不足的位数return 0;
}

        控制台输出信息如下:

               123.0

                 123

8.填充字符的控制

        当设置填充宽度的时候,小于填充宽度的时候,默认使用空格填充,我们也可以调用setFill修改默认的填充字符。示例代码如下:

#include <iostream>
#include <iomanip>using namespace std;int main() {float f = 123;cout<<showpoint<<setprecision(4)<<setw(10)<<f<<endl;//cout<<setfill('A')<<noshowpoint<<setw(10)<<f<<endl;//设置字符A填充不足的位数return 0;
}

9.换行运算符

        endl:插入换行符号('\n')并强制写入缓存,实现输出的回车换行。

10.输入/输出数状态的控制

        默认情况下,数据按照十进制输入/输出。如果要求按照八进制或者十六进制输出,必须指明相应的数据形式,hex为十六进制,dec为十进制。

        以下是一个 C++ 示例代码,演示了八进制、十六进制和十进制的输入输出

#include <iostream>
#include <iomanip> // 用于控制输出格式using namespace std;int main() {int decimalNum;// 十进制输入cout << "Enter a decimal number: ";cin >> decimalNum;// 十六进制输出cout << "Hexadecimal representation: " << hex << decimalNum << endl;// 八进制输出cout << "Octal representation: " << oct << decimalNum << endl;// 十进制输出cout << "Decimal representation: " << dec << decimalNum << endl;return 0;
}

        这段代码首先要求用户输入一个十进制数,然后将其以十六进制、八进制和十进制形式输出。

三、文件流

1.文件流的建立

 1.创建文件流对象的同事打开文件

ifstream inFile("output.txt");

2.先建立文件流对象,再在合适的时候用函数open()打开文件

ifstream inFile;

...

inFile.open("");

2.文件流的关闭

        调用成员函数的close函数。

3.文件状态的判别

1.is_open();判断是否正确打开

2.good():文件操作是否成功

3.fail():和good相反

4.bad():是否非法操作

5.eof():是否达到文件尾部。

4.文件流的定位

1.ios_base::beg 相对于文件首

2.ios_base::cur 相对于文件当前位置

3.ios_base::end 相对于文件尾部

5.有格式输入/输出

        基本与标准输入/输出cin和cout基本相同。

6.无格式输入/输出

        基本与标准输入/输出cin和cout基本相同。

相关文章:

C++中的流

前言 在 C 中&#xff0c;流&#xff08;stream&#xff09;是一种数据传输的抽象概念&#xff0c;用于在程序中对输入和输出进行操作。流分为输入流和输出流&#xff0c;允许数据在程序和外部设备&#xff08;如键盘、屏幕、文件&#xff09;之间进行传输。输入流用于从外部获…...

解决vue3中使用v-html,click不生效的问题

问题背景 说明&#xff1a; 前端接收到来自后端的一个长字符串&#xff0c;要求把里面的图片替换成为超链接&#xff0c;并且要通过请求一个接口进行图片下载。 举例说明 就是下列这样的一个字符串&#xff1a;vaddssss[图片](image_p0_f0.png)dsatewafdsaa[图片](image_p1…...

macOS下Java应用的打包和安装程序制作

文章目录 macOS应用程序结构Java应用打包JavaAppLauncherjpackage其它相关JDK命令附录JavaAppLauncher源码链接macOS应用程序结构 macOS通常以dmg或pkg作为软件发行包,安装到/Applications下后,结构比较统一。 info.plist里的CFBundleExecutable字段可以指定入口,如果不指定…...

OpenAI GPT商店面临质量与合规问题;黄仁勋预测:十年内AI将实时生成游戏画面

&#x1f989; AI新闻 &#x1f680; OpenAI GPT商店面临质量与合规问题 摘要&#xff1a;OpenAI旗下的GPT商店因存在大量涉嫌侵权内容、助长学术不诚实行为及违规内容等问题而引起关注。其中包括未经授权使用迪士尼、漫威角色生成内容的GPT模型&#xff0c;以及声称能绕过剽…...

前端根据pdf连接点击下载pdf而不是直接打开

参考地址: https://www.cnblogs.com/jackson-yqj/p/11321275.html /*** 文件链接转文件流下载--主要针对pdf 解决谷歌浏览器a标签下载pdf直接打开的问题* param url &#xff1a;文件链接* param fileName &#xff1a;文件名;* param type &#xff1a;文件类型;*/functio…...

pytorch中的gather函数的定义和作用是什么?

在PyTorch中&#xff0c;gather函数是一个用于从张量&#xff08;tensor&#xff09;中收集特定索引位置上的元素的函数。它主要用于高级索引和从张量中提取特定信息。 定义&#xff08;python&#xff09; gather函数的基本定义如下&#xff1a; torch.gather(input, dim, i…...

[ABC206E] Divide Both 解题记录

[ABC206E] Divide Both 解题记录 题意简述 给定整数 L , R L,R L,R&#xff0c;求满足以下条件的数对 ( x , y ) (x,y) (x,y) 的数量。 x , y x,y x,y 不互质 x ∤ y x \nmid y x∤y 且 y ∤ x y \nmid x y∤x 题目分析 正难则反&#xff0c;考虑用所有的满足第一条性质的…...

常见的服务器技术和服务器技术的重要性

服务器技术是指一系列用于构建、维护和管理服务器的技术和工具&#xff0c;旨在确保服务器能够高效、稳定、安全地运行&#xff0c;以满足客户端的请求并提供各种服务。它涵盖了服务器硬件、操作系统、网络协议、数据存储和安全等多个方面的知识和技能。今天&#xff0c;德迅云…...

MATLAB中的数学建模:基础知识、实例与方法论

前言 在当今科技高速发展的时代&#xff0c;数学建模成为了解析复杂世界的关键工具&#xff0c;而MATLAB作为一种专业的科学计算软件&#xff0c;为我们提供了强大的数学建模平台。MATLAB不仅仅是Matrix Laboratory的简称&#xff0c;更是一个集数值分析、矩阵计算、算法开发和…...

Flutter与Xamarin跨平台APP开发框架的区别

嘿&#xff0c;各位亲爱的朋友们&#xff01;大家好&#xff0c;我是咕噜铁蛋&#xff01;今天我们要探讨的话题是&#xff1a;Flutter与Xamarin这两款热门的跨平台APP开发框架。我深知选择合适的开发工具对于开发者来说有多么重要。那么&#xff0c;当我们需要开发跨平台应用时…...

【JAVA】Springboot集成Proguard完成jar包混淆

目录 一、需求背景 二、具体实现 一、需求背景 某些情况下需要将jar包交付给第三方&#xff0c;担心第三方会将代码进行反编译&#xff0c;故需要将jar包进行处理。 jar包源码混淆工具有多种&#xff0c;但真正能投入使用的产品并不多。 比如 ClassFinal (ClassFinal: Jav…...

全流程ArcGIS Pro技术应用

GIS是利用电子计算机及其外部设备&#xff0c;采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲&#xff0c;它是在一定的地域内&#xff0c;将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来&#xff0c;达到对地理和属性信息的综合管理。GIS的…...

4.windows ubuntu 子系统:微生物宏基因组测序和分析流程概括。

微生物宏基因组测序和分析流程大致可以分为以下几个步骤&#xff1a; DNA提取&#xff1a;需要从微生物样本中提取DNA。2.建库构建&#xff1a;提取到的DNA需要进行建库构建&#xff0c;包括DNA片段的断裂、末端修复、连接连接适配器等操作。3.高通量测序&#xff1a;建库构建完…...

S2-066分析与复现

Foreword 自struts2官方纰漏S2-066漏洞已经有一段时间&#xff0c;期间断断续续地写&#xff0c;直到最近才完成&#xff0c;o(╥﹏╥)o。羞愧地回顾一下官方通告&#xff1a; 2023.12.9发布&#xff0c;编号CVE-2023-50164&#xff0c;主要影响版本是 2.5.0-2.5.32 以及 6.0.…...

让天下没有难学的大模型!我整理一份大模型技术知识图谱!

最近陆续有一些同学反馈&#xff0c;感觉大模型知识点太多了&#xff0c;找不到头绪。 今天我整理一份大模型技术以及应用的知识图谱&#xff0c;让大家轻松学习大模型&#xff0c;喜欢点赞、收藏、关注。 另外&#xff0c;技术交流可以文末加入我们。 大模型的预训练技术 …...

大屏动效合集更更更之实现百分比环形

实现效果 参考链接&#xff1a; https://pslkzs.com/demo/pie/demo1.php 写在最后&#x1f352; 源码&#xff0c;关注&#x1f365;苏苏的bug&#xff0c;&#x1f361;苏苏的github&#xff0c;&#x1f36a;苏苏的码云...

基于springboot的反诈宣传平台

技术&#xff1a;springbootmysqlvue 一、系统背景 反欺诈平台可以对公交信息进行集中管理&#xff0c;可以真正避免传统管理的缺陷。反欺诈平台是一款运用软件开发技术设计实现的应用系统&#xff0c;在信息处理上可以达到快速的目的&#xff0c;不管是针对数据添加&#xff…...

面试算法-82-不同路径

题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff1f; …...

阿里云ECS经济型e实例,2核2G配置、3M固定带宽和40G ESSD Entry系统盘

阿里云服务器99元一年配置为云服务器ECS经济型e实例&#xff0c;2核2G配置、3M固定带宽和40G ESSD Entry系统盘&#xff0c;新用户和老用户均可买&#xff0c;续费不涨价依旧是99元一年&#xff0c;阿里云服务器网aliyunfuwuqi.com来详细说下阿里云99元服务器性能测评&#xff…...

Java基础知识总结(13)

数据结构 链表 优点&#xff1a;随机增删元素效率高&#xff08;因为增删元素不涉及到大量元素的位移&#xff09; 缺点&#xff1a;查询效率较低&#xff0c;每一次查找某个元素的时候都需要从头结点开始往下遍历 LinkedList集合 /* 链表的优点&#xff1a; 由于链表的元…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念&#xff1a; 1&#xff09;ZYNQ全称&#xff1a;ZYNQ7000 All Pgrammable SoC 2&#xff09;SoC:system on chips(片上系统)&#xff0c;对比集成电路的SoB&#xff08;system on board&#xff09; 3&#xff09;ARM&#xff1a;处理器…...

UE5 音效系统

一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类&#xff0c;将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix&#xff0c;将上述三个类翻入其中&#xff0c;通过它管理每个音乐…...

LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考

目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候&#xff0c;显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...

算法250609 高精度

加法 #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char input1[205]; char input2[205]; int main(){while(scanf("%s%s",input1,input2)!EOF){int a[205]…...

PostgreSQL 对 IPv6 的支持情况

PostgreSQL 对 IPv6 的支持情况 PostgreSQL 全面支持 IPv6 网络协议&#xff0c;包括连接、存储和操作 IPv6 地址。以下是详细说明&#xff1a; 一、网络连接支持 1. 监听 IPv6 连接 在 postgresql.conf 中配置&#xff1a; listen_addresses 0.0.0.0,:: # 监听所有IPv4…...