C++输入流和输出流介绍

news2024/11/25 15:26:06

C++ 又可以称为“带类的 C”,即可以理解为 C++ 是 C 语言的基础上增加了面向对象(类和对象)。在此基础上,学过 C 语言的读者应该知道,它有一整套完成数据读写(I/O)的解决方案:

  • 使用 scanf()、gets() 等函数从键盘读取数据,使用 printf()、puts() 等函数向屏幕上输出数据;

  • 使用 fscanf()、fgets() 等函数读取文件中的数据,使用 fprintf()、fputs() 等函数向文件中写入数据。

要知道,C 语言的这套 I/O 解决方案也适用于 C++ 程序,但 C++ 并没有“偷懒”,它自己独立开发了一套全新的 I/O 解决方案,其中就包含大家一直使用的 cin 和 cout。前面章节中,我们一直在用 cin 接收从键盘输入的数据,用 cout 向屏幕上输出数据(这 2 个过程又统称为“标准 I/O”)。除此之外,C++ 也对从文件中读取数据和向文件中写入数据做了支持(统称为“文件 I/O”)。

本质上来说,C++ 的这套 I/O 解决方案就是一个包含很多类的类库(作为 C++ 标准库的组成部分),这些类常被称为“流类”。

C++ 的开发者认为数据输入和输出的过程也是数据传输的过程,数据像水一样从一个地方流动到另一个地方,所以 C++ 中将此过程称为“流”,实现此过程的类称为“流类”。

C++ 中用于实现数据输入和输出的这些流类以及它们之间的关系:

其中,图中的箭头代表各个类之间的派生关系。比如,ios 是所有流类的基类,它派生出 istream 和 ostream。特别需要指出的是,为了避免多继承的二义性,从 ios 派生出 istream 和 ostream 时,均使用了 virtual 关键字(虚继承)。

这些流类各自的功能分别为:

  • istream:常用于接收从键盘输入的数据;

  • ostream:常用于将数据输出到屏幕上;

  • ifstream:用于读取文件中的数据;

  • ofstream:用于向文件中写入数据;

  • iostream:继承自 istream 和 ostream 类,因为该类的功能兼两者于一身,既能用于输入,也能用于输出;

  • fstream:兼 ifstream 和 ofstream 类功能于一身,既能读取文件中的数据,又能向文件中写入数据。

C++输入流和输出流

在前面章节的学习中,只要涉及输入或者输出数据,我们立马想到的就是 cin 和 cout。其实,cin 就是 istream 类的对象,cout 是 ostream 类的对象,它们都声明在 <iostream> 头文件中,这也解释了“为什么在 C++ 程序中引入 <iostream> 就可以使用 cin 和 cout”(当然使用 cin 和 cout,还需要声明 std 命名空间)。

除此之外,<iostream> 头文件中还声明有 2 个 ostream 类对象,分别为 cerr 和 clog。它们的用法和 cout 完全一样,但 cerr 常用来输出警告和错误信息给程序的使用者,clog 常用来输出程序执行过程中的日志信息(此部分信息只有程序开发者看得到,不需要对普通用户公开)。

cout、cerr 和 clog 之间的区别如下:

  1. cout 除了可以将数据输出到屏幕上,通过重定向(后续会讲),还可以实现将数据输出到指定文件中;而 cerr 和 clog 都不支持重定向,它们只能将数据输出到屏幕上;

  2. cout 和 clog 都设有缓冲区,即它们在输出数据时,会先将要数据放到缓冲区,等缓冲区满或者手动换行(使用换行符 '\n' 或者 endl)时,才会将数据全部显示到屏幕上;而 cerr 则不设缓冲区,它会直接将数据输出到屏幕上。

除了以上 2 点特性上的不同之外,cerr、clog 和 cout 没有任何不同。之所以我们常用 cout,是因为 cerr 和 clog 有各自不同的适用场景。以 cerr 为例,一旦程序某处使用 cerr 输出数据,我们自然而然地会认为此处输出的是警告或者错误信息。

值得一提的是,类似 cin、cout、cerr 和 clog 这样,它们都是 C++ 标准库的开发者创建好的,可以直接拿来使用,这种在 C++ 中提前创建好的对象称为内置对象。实际上,<iostream> 头文件中还声明有处理宽字符的 4 个内置对象,分别为 wcin、wcout、wcerr 以及 wclog,由于不是本节重点,这里不再对它们做详细讲解。

如下程序演示了 cin、cout、cerr 和 clog 的基本用法:

    #include <iostream>
    #include <string>
    int main() {
        std::string url;
        std::cin >> url;
        std::cout << "cout:" << url << std::endl;
        std::cerr << "cerr:" << url << std::endl;
        std::clog << "clog:" << url << std::endl;
        return 0;
    }

程序执行结果为:

http://c.biancheng.net
cout:http://c.biancheng.net
cerr:http://c.biancheng.net
clog:http://c.biancheng.net

注意,此程序中并没有考虑 cerr 和 clog 各自特有的含义,这里仅是为了演示 cerr 和 clog 的基础用法,不建议读者这样使用。另外,如果程序中 std 命名空间提前声明,则所有的 std:: 可以省略。

它们的用法远不止此,istream 和 ostream 类提供了很多实用的函数,cin、cout、cerr 和 clog 作为类对象,当然也能调用。

表 1 罗列了 cin 对象常用的一些成员方法以及它们的功能:

表 2 罗列了 cout、cerr 和 clog 对象常用的一些成员方法以及它们的功能:

    #include <iostream>
    using namespace std;
    int main() {
        char url[30] = {0};
        //读取一行字符串
        cin.getline(url, 30);
        //输出上一条语句读取字符串的个数
        cout << "读取了 "<<cin.gcount()<<" 个字符" << endl;
        //输出 url 数组存储的字符串
        cout.write(url, 30);
        return 0;
    }

程序执行结果为:

http://c.biancheng.net读取了 23 个字符http://c.biancheng.net

注意,表 1 和表 2 中仅罗列了 istream 和 ostream 类中常用的一些成员方法,关于这些方法的具体用法,后续章节会做详细介绍。

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

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

相关文章

DAZ To UMA⭐二.设置DAZ导出的变形内容 和 获取模型纹理贴图位置

文章目录 🟩 设置DAZ导出的内容1️⃣ 找到要导出的参数名称2️⃣ 打开导出面板3️⃣ 设置导出规则举例 : 导出身体Assets🟦 获取模型纹理贴图🟩 设置DAZ导出的内容 设置参数有两个目的: DAZ可以进行模型的参数调整,例如胖瘦等等,那如何将这些调整后的数值一起导出到FBX中…

Window通过VMWare搭建Linux集群后,将虚拟机暴露到宿主机局域网中,实现个人服务器搭建

目录 一、目的二、实现的方法 2.1 保证VMnet8为NAT模式2.2 获取虚拟机IP后&#xff0c;与宿主机进行端口绑定2.3 查看宿主机端口配置是否生效2.4 宿主机的端口准入规则设置2.5 效果 一、目的 解决宿主机通过VMware WorkStation安装了虚拟机后&#xff0c;宿主机所在的局域网…

A股风格因子看板 (2023.09 第07期)

该因子看板跟踪A股风格因子&#xff0c;该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子&#xff0c;用以分析市场风格切换、组合风格景露等。 今日为该因子跟踪第7期&#xff0c;指数组合数据截止日2023-08-31&#xff0c;要点如下 近1年A股风格因子收益走…

开源日报 0821:帮你修复老旧照片

这篇文章总结了几个开源项目的特点和优势。其中包括了 Python 资源列表、金融研究工具、动画精灵程序、游戏和旧照片修复项目等。这些项目提供了丰富的功能和技术支持&#xff0c;用户可以根据自己的需求进行定制和改进。总的来说&#xff0c;这些开源项目为开发者和用户提供了…

在如今内卷严重的背景下,程序员该如何提高自己的收入,享受美好人生?

无论是当今程序员行业&#xff0c;还是各行各业&#xff0c;内卷都非常严重&#xff0c;好多人都处于了一种卷又卷不过&#xff0c;躺又躺不平的境地&#xff0c;十分的难受&#xff0c;那么作为一个程序员而言&#xff0c;该如何在这样的境地下提高自己的收入&#xff0c;享受…

动力节点老杜JavaWeb笔记(全)

Servlet 关于系统架构 系统架构包括什么形式&#xff1f; C/S架构B/S架构 C/S架构&#xff1f; Client / Server&#xff08;客户端 / 服务器&#xff09;C/S架构的软件或者说系统有哪些呢&#xff1f; QQ&#xff08;先去腾讯官网下载一个QQ软件&#xff0c;几十MB&#xff…

Innodb底层原理与Mysql日志机制

MySQL内部组件结构 Server层 主要包括连接器、词法分析器、优化器、执行器等&#xff0c;涵盖 MySQL 的大多数核心服务功能&#xff0c;以及所有的内置函数&#xff08;如日期、时间、数学和加密函数等&#xff09;&#xff0c;所有跨存储引擎的功能都在这一层实现&#xff0c…

1536. 排布二进制网格的最少交换次数;754. 到达终点数字;1106. 解析布尔表达式

1536. 排布二进制网格的最少交换次数 核心思想&#xff1a;贪心。枚举每一行&#xff0c;然后去找离这行最近的满足要求的那一行。我们用j保存每一行的最后一个1&#xff0c;那么尾部的0个数为n-1-j&#xff0c;每一行需要的0个数为n-i-1&#xff0c;所以得出结论 i > j。然…

asp.net网站的建立及运行

点击创建新项目 在输入框中输入asp.net&#xff0c;并选择图中的 点击下一步 点击创建 然后&#xff0c;右键&#xff0c;添加&#xff0c;新建项 选择web窗体 点击添加 点击视图&#xff0c;工具箱 选择一个label&#xff0c;记住这个id 空白处右键&#xff0c;查看代码 添…

usmile F10 系列数字牙刷:数字化刷牙体验的新巅峰

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

51单片机4【玩转开发板】

1.开发板完全介绍 1.配件 2.开发板主板及板载原件 1.单片机 &#xff08;1&#xff09;注意不要装反了&#xff0c;凹槽的一面向上是正的 &#xff08;2&#xff09;不要再开电的时候取下或者装上。 2.单片机工作必备的外围电路 1.晶振 2.复位电路 3.电源供电电路 4.USB下载…

NLP文本生成全解析:从传统方法到预训练完整介绍

目录 1. 引言1.1 文本生成的定义和作用1.2 自然语言处理技术在文本生成领域的使用 2 传统方法 - 基于统计的方法2.1.1 N-gram模型2.1.2 平滑技术 3. 传统方法 - 基于模板的生成3.1 定义与特点3.2 动态模板 4. 神经网络方法 - 长短时记忆网络(LSTM)LSTM的核心概念PyTorch中的LST…

漫画 | 两年,我学会了所有的编程语言!

本文想要探讨的一个话题是&#xff1a;作为一个程序员&#xff0c;如何看待这么多的编程语言&#xff1f;是不是要学习&#xff1f;该怎么学习&#xff1f;其实很多人都有这样的体会&#xff0c;当你学会了一门语言以后&#xff0c;再去学习新的语言&#xff0c;难度会大大降低…

音乐随行,公网畅享,群辉Audiostation给你带来听歌新体验!

文章目录 本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是本教程使用环境&#xff1a;1 群晖系统安装audiostation套件2 下载移动端app3 内网穿透&#xff0c;映射至公网 很多老铁想在上班路上听点喜欢的歌或者相声解解闷儿&#xff0c;于是打开手…

10分钟设置免费海外远程桌面

前言 本教程将向您介绍如何使用 Amazon Lightsail 服务的免费套餐轻松搭建属于您的远程桌面。依托于 Amazon 全球可用区&#xff0c;您可以在世界各地搭建符合您配置需求的远程桌面。 本教程需要先拥有亚马逊云科技海外账户。现在注册亚马逊云科技账户可以享受12个月免费套餐…

基于springboot广场舞团系统springboot16

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…

云服务器ECS_云主机_服务器托管_计算-阿里云

阿里云服务器是什么&#xff1f;云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务&#xff0c;云服务器可以降低IT成本提升运维效率&#xff0c;免去企业或个人前期采购IT硬件的成本&#xff0c;阿里云服务器让用户像使用水、电、天然气等公共资源一样便捷、高效地使用服务器…

Linux0.11——第一回 最开始的两行代码

按下开机键后究竟发生了什么 官方教科书说法&#xff1a; BIOS 按照“启动顺序”&#xff0c;把控制权转交给排在第一位的存储设备&#xff1a;硬盘。然后在硬盘里寻找主引导记录的分区&#xff0c;这个分区告诉电脑操作系统在哪里&#xff0c;并把操作系统被加载到内存中&…

一、python解题——求序列最长递增

解题代码&#xff1a; import os import sys# 请在此输入您的代码 n int(input()) a list(map(int, input().split())) # 创建一个初始元素全为1的列表&#xff0c;用来存放每个递增序列的长度 b [1 for x in range(0, n)] # 设置num&#xff0c;用来控制b列表的下标 num …

中秋编程之夜:程序员的特殊庆祝方式

中秋编程之夜&#xff1a;程序员的特殊庆祝方式 摘要引言正文1. 中秋编程马拉松2. 月光下的代码编写3. 月饼分享与技术讨论4. 创意月亮主题项目 总结参考资料 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb; 《java 面试题大全》 &am…