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基本相同。

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

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

相关文章

边缘计算【智能+安全检测】系列教程-- Jeton Agx Orin 基础环境搭建

1 .前期准备 Jetson Agx Orin 比Jetson Agx Orin Xavier的算力要高&#xff0c;性能要好通常用来做自动驾驶的AI推理&#xff0c;具体外观如下图 1.刷机软件sdkmanager&#xff1a;下载链接 NVIDIA账号需要注册&#xff0c;正常一步一步往下走就行。在ubuntu18以上的系统安…

Verilog刷题笔记45

题目&#xff1a;Given the finite state machine circuit as shown, assume that the D flip-flops are initially reset to zero before the machine begins. Build this circuit. 解题&#xff1a; module top_module (input clk,input x,output z ); wire [2:0]size;dtou…

第一篇:概述、 目录、适用范围及术语 --- IAB/MRC《增强现实(AR)广告(效果)测量指南1.0 》

第一篇&#xff1a;概述、目录、适用范围及术语 - IAB与MRC及《增强现实广告效果测量指南1.0》 --- 我为什么要翻译美国IAB科技公司系列标准 ​​​​​​​​​​​​​​ 翻译计划 第一篇概述—IAB与MRC及《增强现实广告效果测量指南》之目录、适用范围及术语第二篇广告效…

WSL+Ununtu+Docker踩坑指南

Ubuntu安装docker后启动不了&#xff0c;解决问题如下&#xff1a; 1.在wsl中安装Ubuntu&#xff0c;在Ubuntu中安装docker&#xff0c;此时用的Ubuntu的版本为Ubuntu-22.04发行版&#xff0c;安装docker教程如下。 https://docs.docker.com/engine/install/ubuntu/2. 完成安…

第十五届蓝桥杯模拟赛 第三期 (C++)

第二次做蓝桥模拟赛的博客记录&#xff0c;可能有很多不足的地方&#xff0c;如果大佬有更好的思路或者本文中出现错误&#xff0c;欢迎分享思路或者提出意见 题目A 请问 2023 有多少个约数&#xff1f;即有多少个正整数&#xff0c;使得 2023 是这个正整数的整数倍。 答案&…

Linux telnet命令教程:远程控制工具(附实例详解和注意事项)

Linux telnet命令介绍 telnet&#xff08;Teletype Network&#xff09;是一种网络协议&#xff0c;用于在远程主机和本地计算机之间建立文本式连接。它最初于1969年开发&#xff0c;是Internet的早期协议之一。telnet命令使用TCP/IP网络通过端口23建立连接&#xff0c;提供了…

MySQL B树 和B+数据的区别

MySQL B树 和B数据的区别 树分类&#xff1a;二叉树完全二叉树满二叉树堆红黑树 B树B树 首先我们搞清楚数据结构中的 树这个概念 树 分类&#xff1a; 二叉树 限定每个节点的子节点最多只有2个子节点&#xff0c;且有左右之分。完全二叉树 满二叉树 堆 红黑树 B树 B树 …

上位机图像处理和嵌入式模块部署(qmacvisual之ROI设定)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 ROI&#xff0c;全称是region of interest&#xff0c;也就是感兴趣区域。这里面一般分成两种情况&#xff0c;一种是所有的算法都依赖于这个ROI&a…

谷粒商城——缓存的读写一致性

1. 对于实时性要求很强的数据&#xff0c;如果修改完数据库&#xff0c;需要保证缓存中的数据也更新为相应的最新值。此时需要在更新数据库之前加上写锁&#xff0c;在更新/删除完缓存后才释放写锁。 伪代码如下&#xff1a; lock.writeLock().lock(); updateDB(); updateCac…

Jenkins中使用Generic Webhook Trigger插件实现持续集成

项目环境 宝塔Linux面板DockerJenkinsgitee 目的 实现每次push推送dev分支到gitee上&#xff0c;Jenkins自动构建项目&#xff1b;push其它分支时&#xff0c;不运行。 实现方法 1.在Jenkins上安装Generic Webhook Trigger插件 在“系统设置–插件管理–可选插件”界面搜…

第390场 LeetCode 周赛题解

A 每个字符最多出现两次的最长子字符串 滑动窗口&#xff1a;枚举窗口的左边界&#xff0c;尽可能右移窗口的右边界。 (当然也可以暴力枚举) class Solution { public:int maximumLengthSubstring(string s) {vector<int> cnt(26);int res 0;for (int l 0, r -1, n s…

构建以太网交换网络——(生成树实验)

实验介绍 关于本实验 以太网交换网络中为了进行链路备份&#xff0c;提高网络可靠性&#xff0c;通常会使用冗余链路。但是使用冗余链路会在交换网络上产生环路&#xff0c;引发广播风暴以及MAC地址表不稳定等故障现象&#xff0c;从而导致用户通信质量较差&#xff0c;甚至…

【LeetCode-45.跳跃游戏】

题目详情&#xff1a; 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返…

C语言 数组指针 指针数组

指针数组 什么是指针数组&#xff0c;他是一个数组&#xff0c;数组的元素是指针。但是指针也有多种数据类型&#xff0c;有数组指针、函数指针、整形指针、字符串指针。 现在我就使用函数指针来写代码&#xff0c;也就是函数指针数组的应用代码&#xff1a; #include <s…

Debezium日常分享系列之:设置MySQL数据库以支持数据实时采集

Debezium日常分享系列之&#xff1a;设置MySQL数据库以支持数据实时采集 一、创建用户二、启用二进制日志三、启用 GTID四、配置会话超时五、启用查询日志事件六、验证二进制日志行值选项七、Debezium技术总结 在安装和运行 Debezium 连接器之前&#xff0c;需要执行一些 MySQL…

Vscode按键占用问题解决

Vscode按键占用 在使用vscode的过程中&#xff0c;官方按键 Ctrl . 按键可以提示修复代码中的问题&#xff0c;但是发现按了没有反应。 解决问题 首先确认vscode中是否设置了这个按键&#xff0c;默认设置了的系统输入法中是否有按键冲突了&#xff0c;打开输入法设置检查 …

es同义词配置规则

同义词配置有两种: 1,a>b: 通俗的来讲,就是尽管用户输入的是a,但是es在查询的是会转成b去搜索,">"左边的词全部会被右边的词替换。 2,a,b:通俗的来讲,就是不管用户输入的是a还是b,es在查询的是用a,或者b搜索.比如 保温杯,杯子,用户输入的是"保温杯"…

学习java第二十二天

IOC 容器具有依赖注入功能的容器&#xff0c;它可以创建对象&#xff0c;IOC 容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。通常new一个实例&#xff0c;控制权由程序员控制&#xff0c;而"控制反转"是指new实例工作不由程序员来做而是交给Sp…

DNS服务器的分布式架构和集中式架构的区别

DNS服务器是域名系统的核心组件之一&#xff0c;用于解析域名和IP地址之间的映射关系。DNS服务器的架构形式有分布式和集中式两种模式。下面德迅云安全给您介绍DNS服务器的分布式架构和集中式架构的区别。 DNS服务器的分布式架构和集中式架构有什么区别&#xff1f; 1.分布式架…

[iOS]GCD(一)

[iOS]GCD(一) 文章目录 [iOS]GCD(一)GCD的概要GCD的APIDispatch Queuedispatch_queue_createMain Dispatch_set_target_queuedispatch_afterDispatch Groupdispatch_barrier_asyncdispatch_applydispatch_applydispatch_suspend/dispatch_resumeDispatch Semaphoredispatch_onc…