C++面向对象程序设计 - 输入和输出

        程序的输入指的是文件将数据传送给程序,程序的输出指的是从程序将数据传送输出文件。

        C++的输入和和输出包括以下三个方面:

  1. 对系统指定的标准设备的输入和输出,即从键盘输入数据,输出到显示器屏幕。
  2. 以外存磁盘(或光盘、移动存储)文件为对象进行输入和输出,例如从磁盘文件输入数据,数据输出到磁盘文件。
  3. 对内存中指定的空间进行输入和输出,通常指定一个字符数组作为存储空间(实际上可以利用空间存储任何信息)。

        这种输入输出称为标准输入输出,简称标准I/O。为了实现数据的有效流动,C++系统提供了庞大的I/O类库,调用不同的类去实现不同的功能。

        输入和输出是数据传送的过程,数据如流水一样从一处流向另一处。C++形象地将此过程称为流(stream)。C++的输入输出流是指由若干字节组成的字节序列,这些字节中的数据按顺序从一个对象传送到另一对象。流表示了信息从源到目的端的流动。

        在C++中,输入输出流被定义为类,C++的I/O库中的类称为流类(stream class),用流类定义的对象称为流对象。在之前案例中使用到的cout和cin则是iostream类的对象。

一、iostream类库中有关的类

        C++编译系统提供了用于输入输出的iostream类库,iostream这个单词是由3个部分组成的,即i-o-stream,意为输入输出流。在iostream类库中包含许多用于输入输出的类。

        常用如下表:

类名作用在哪个头文件中声明
ios抽象类iostream

istream

ostream

iostream

通用输入流和其他输入流的基类

通用输出流和其他输出流的基类

通用输入输出流和其他输入输出流的基类

iostream

iostream

iostream

ifstream

ofstream

fstream

输入文件流类

输出文件流类

输入输出文件流类

fstream

fstream

fstream

istrstream

ostrstream

strstream

输入字符串流类

输出字符串流类

输入输出字符串流类

strstream

strstream

strstream

        ios是抽象基类,由它派生出istream类和ostream类,两个类名第一个字母i和o分别代表输入(input)和输出(output)。istream类支持输入操作,ostream类支持输出操作,iostream类支持输入输出操作。iostream类是从istream类和ostream类通过多重继承而派生的类。

        C++对文件的输入输出需要用ifstream和ofstream类,两个类中第一个字母i和o分别代表输入和输出,第二个字母f代表文件(file)。ifstream支持对文件的输入操作,ostream支持对文件的输出操作。ifstream类继承了istream类,ofstream类继承了ostream类,fstream类继承了iostream类。

1.1 示例istream和ostream

        从控制台读取输入并输出信息,代码如下:

#include <iostream>
#include <string>int main(){std::string input;									//定义变量inputstd::cout <<"Please enter your name: ";				// 使用ostream的cout对象std::cin >>input;									// 使用istream的cin对象std::cout <<"You name is: " <<input <<std::endl;	return 0;
}

        运行结果如下图:

1.2 示例iostream和fstream

        读取本地.txt文件和写入.txt文件中,首先我们在案例代码文件的当前目录,创建一个input.txt文件,并写下如下内容:

Hello World!
This is an example of copying the file input.txt to output.txt.

        再创建一个空文件output.txt文件。

        将input.txt中内容复制到output.txt文件中代码如下:

#include <fstream>
#include <iostream>
#include <string>int main(){// 创建一个ifstream对象来读取文件std::ifstream inputfile("input.txt");// 创建一个ofstream对象来写入文件std::ofstream outputfile("output.txt");//判断读取文件是否存在if(!inputfile){std::cerr <<"Unable to open input file" <<std::endl;return 1;}// 判断输出文件是否存在if(!outputfile){std::cerr <<"Unable to open output file" <<std::endl;return 1;}// 开始复制input.txt中内容到output..txt文件中std::string line;while(std::getline(inputfile, line)){	// 从输入文件读取每一行outputfile <<line <<std::endl;		// 将读取的行写入输出文件}// 操作完成后需要关闭输入和输出流inputfile.close();		//关闭输入文件outputfile.close();		//关闭输出文件// 显示输出结果std::cout <<"File copy complete." <<std::endl;return 0;
}

        系统编译后并运行,得到结果如下图:

        此时再打开output.txt,则input.txt中内容已复制过来,如下图:

二、与iostream类库有关的头文件

        iostream类库中不同的类的声明被放在不同的头文件中,用户在自己的程序中用#include命令包含了有关的头文件就相当于在本程序中声明了所需要用到的类。

        头文件是程序与类库的接口,iostream类库的接口分别由不同的头文件来实现。常用的有:

iostream:包含了输入输出流进行操作所需的基本信息。

fstream:用于用户管理的文件的I/O操作。

strstream:用于字符串流I/O。

stdiostream:用于混合使用C和C++的I/O机制时,例如想将C程序转变为C++程序。

iomanip:在使用格式化I/O时应包含此文件。

        iomanip库用于控制输出的格式,例如输出精度、设置字段宽度等。如下面sdt::fixed和std:setprecision来控制浮点数的输出格式,使用std::setw来设置字段宽度。

        示例代码如下:

#include <iostream>
#include <iomanip>int main(){// 定义PIdouble PI = 3.14159265358979323846;// 直接输出PI变量std::cout <<"Output variable: PI = " <<PI <<std::endl;// 设置输出精度和宽度std::cout <<"Set output precision and then output variables:" <<std::endl;std::cout <<"PI = " <<std::fixed <<std::setprecision(2) <<PI <<std::endl;std::cout <<std::endl;// 输出整数和浮点数,并使用setw设置字段宽度int x = 123;double y = 456.789;std::cout <<"Set output width and then output variables:" <<std::endl;std::cout <<std::setw(5) <<x <<std::endl;std::cout <<std::setw(10) <<y <<std::endl;return 0;
}

        输出结果如下图:

三、在iostream头文件中定义的流对象

        在iostream头文件中定义的类有ios、istream、ostream、istream_withassign、ostream_withassign、iostream_withassign等。

        iostream包含了对输入输出流进行操作所需的基本信息,因此大多数C++程序都包括iostream,在iostream头文件中不仅定义了有关的类,还定义了4种流对象,如下表:

对象含义对应设备对应的类C语言中相应的标准文件
cin标准输入流键盘istream_withassignstdin
cout标准输出流屏幕ostream_withassignstdout
cerr标准错误流屏幕ostream_withassignstderr
clog标准错误流屏幕ostream_withassignstderr

        cin是istream的派生类istream_withassign的对象,它是从标准输入设备(键盘)输入到内存的数据流,称为cin流或标准输入流。

        cout是ostream的派生类ostream_withassign的对象,它是从内存输入到标准输出设置(显示器)的数据流,称为cout或标准输出流。

        cerr和clog作用相似,均为输出设置(显示器)输出出错信息,所以向显示器输出错误信息时用cerr或clog流。

四、在iostream头文件中重载运算符

        ”<<“和”>>“在C++中本来是被定义为左位移运算符和右位移运算符的,由于iostream头文件中对它们进行了重载,使它们能用作标准类型数据的输入和输出运算符。在使用它们前,必须在程序中用#include命令把iostream包含到程序中。代码如下:

#include <iostream>

        至所以可cout和cin可以使用”<<“和”>>“对标准数据类型进行输出和输入,是在istream和ostream类中分别有一组成员函数对位移运算符进行重载,以便能用它输入或输出各种标准数据类型的数据。示例如下:

ostream operator << (int);            // 用于向输出流插入一个int数据
ostream operator << (float);          // 用于向输出流插入一个float数据
ostream operator << (char);           // 用于向输出流插入一个char数据
ostream operator << (char *);         // 用于向输出流插入一个字符串数据

        在istream类中已将运算符”>>“重载为以下标准类型的提取运算符:char、signed char、unsigned char、short、unsigned short、int 、unsigned int、long、unsigned long、float、double、long double、char *、signed char *、unsigned char*等。

        在ostream类中将”<<“重载为插入运算符,其适用类型除了以上标准类型外,还增加了一个void *类型。

        如果想将”<<“和”>>“用于自己声明的类型的数据,除了需要包含头文件iostream外,还必须对”<<“和”>>“进行重载。具体如何重载这里就不细讲了,之前已有篇幅讲述过运算符重载相关内容,须了解的朋友可以翻看前面讲的内容,地址:C++面向对象程序设计 - 运算符重载_运算符重载 小花在上《面向对象程序设计》这门课之前,一直认为“+”法只能实现1+2-CSDN博客

        

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

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

相关文章

gdc2024:Raytracing in Snowdrop技术实现与性能优化策略

在今年的GDC&#xff08;游戏开发者大会&#xff09;的Advanced Graphics Summit上&#xff0c;关于Snowdrop引擎中光线追踪技术的讨论引起了广泛关注。 一、光线追踪全局照明的实现细节 屏幕空间追踪&#xff1a; 屏幕空间追踪从相机出发&#xff0c;对屏幕上的每个像素点生成…

C++ 红黑树

目录 1.红黑树的概念 2.红黑树的性质 3.红黑树节点的定义 4.红黑树的插入操作 5.数据测试 1.红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个…

C++基础与深度解析 | 泛型算法 | bind | Lambda表达式

文章目录 一、泛型算法1.泛型算法的分类2.迭代器分类 二、bind与lambda表达式1.bind2.lambda表达式 三、泛型算法的改进--ranges(c20) 一、泛型算法 C中的泛型算法是标准模板库&#xff08;STL&#xff09;的一部分&#xff08;这里重点讨论 C 标准库中定义的算法&#xff0c;而…

【vue-cli搭建vue项目的过程2.x】

vue-cli搭建vue项目 vue-cli搭建vue项目安装node安装vue-cli脚手架并创建项目安装 Ant Design Vue或element-ui(笔者使用Ant-design-vue组件&#xff0c;并全局引入)开发安装三方库包1、Package.json文件---引入如下package.json文件执行npm i或npm install命令即可下载如下依赖…

数据结构~~链式二叉树

目录 一、基本概念 链式存储概念 二、链式二叉树的结构 链式二叉树结构 构建链式二叉树 二叉树的遍历 二叉树节点和高度等 二叉树销毁 三、链式二叉树的练习 相同的树 对称二叉树 另外一颗子树 二叉树前序遍历 二叉树遍历 四、完整代码 Tree.h Tree.c 五、总结 一…

Linux服务升级:Predixy 升级代理 Redis-cluster 集群

目录 一、实验 1.环境 2. 启动Redis服务 3.Predixy 升级代理 Redis-cluster 集群 二、问题 1. Predixy进行set操作报错 2.如何创建脚本启动predixy 3.Redis代理对比 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统版本节点软件IP备注CentOS7.9Redis…

Springboot开发 -- Postman 调试类型详解

引言 在 Spring Boot 应用开发过程中&#xff0c;接口测试是必不可少的一环。Postman 作为一款强大的 API 开发和测试工具&#xff0c;可以帮助开发者轻松构建、测试和管理 HTTP 请求。本文将为大家介绍如何在 Spring Boot 开发中使用 Postman 进行接口测试。 一、准备工作 安…

C/C++|malloc分配内存详解

看本节前&#xff0c;希望读者有linux内存分布的基本概念&#xff0c;可以阅读这篇文章&#xff1a; 进程虚拟地址空间和函数调用栈 在本节中希望读者可以一口气阅读完所有内容。 本博客内容全部来自小林coding&#xff1a;malloc 是如何分配内存的&#xff1f; 这里仅为笔记记…

Linux/Ubuntu 中安装 ZeroTier,实现内网穿透,2分钟搞定

相信很多人都有远程连接家中设备的需求&#xff0c;如远程连接家中的NAS、Windows等服务&#xff0c;所以会涉及到一个内网穿透工具的使用&#xff0c;如果没有公网IP的情况下&#xff0c;推荐大家使用ZeroTier&#xff0c;这是一款强大的内网穿透工具。 mac和windows版的操作…

Nginx-狂神说

Nginx概述 公司产品出现瓶颈&#xff1f; 我们公司项目刚刚上线的时候&#xff0c;并发量小&#xff0c;用户使用的少&#xff0c;所以在低并发的情况下&#xff0c;一个jar包启动应用就够了&#xff0c;然后内部tomcat返回内容给用户。 但是慢慢的&#xff0c;使用我们平台…

K8S认证|CKA题库+答案| 13. sidecar 代理容器日志

目录 13、使用 sidecar 代理容器日志 CKA v1.29.0模拟系统免费下载试用&#xff1a; 题目&#xff1a; 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、生成yaml文件 3&#xff09;、官网找模板 4&#xff09;、编辑yaml文件 5&#xff09;、应用yaml…

车载电子电器架构 —— 智能座舱技术

车载电子电器架构 —— 智能座舱技术 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的…

GEO数据挖掘-GEO背景知识+表达芯片分析思路

From生物技能树 GEO数据挖掘第一节 &#xff08;pipeline&#xff09; 文章目录 1.图表分析2.GEO背景介绍及分析思路3.代码分析流程4.复杂数据分析理论知识1.数据从哪里来2.有什么类型的数据可挖掘3.如何筛选基因&#xff08;分析方法&#xff09;在这里插入图片描述 图表介绍1…

Jenkins + github 自动化部署配置

1 Jenkins安装 AWS EC2安装Jenkins&#xff1a;AWS EC2 JDK11 Jenkins-CSDN博客 AWS EC2上Docker安装Jenkins&#xff1a;https://blog.csdn.net/hhujjj2005/article/details/139078402 2 登录jenkins http://192.168.1.128:8080/ $ docker exec -it d1851d9e3386 /bin/ba…

Multi-objective reinforcement learning approach for trip recommendation

Multi-objective reinforcement learning approach for trip recommendation A B S T R A C T 行程推荐是一项智能服务&#xff0c;为游客在陌生的城市提供个性化的行程规划。 它旨在构建一系列有序的 POI&#xff0c;在时间和空间限制下最大化用户的旅行体验。 将候选 POI 添…

【Shell】sed编辑器实例

sed是用来解析和转换文本的工具&#xff0c;它使用简单&#xff0c;是简洁的程序设计语言。 sed编辑器 &#xff08;一&#xff09; sed编辑器基础1. 简介2. sed的模式空间 &#xff08;二&#xff09;基本的sed编辑命令&#xff08;三&#xff09;sed命令实例1. 向文件中添加或…

MFC GDI 绘图模式、映射模式、画笔、笔、字体

一 GDI 绘图模式&#xff08;RoP2 Mode&#xff09; 在使用VC MFC进行图形程序编程时&#xff0c;常会用到GDI绘图指令&#xff0c;而要做到绘图时有橡皮筋动态效果&#xff0c;就需设置GDI绘图模式。GDI绘图模式有多种&#xff0c;如下&#xff1a; 常用R2_NOT模式来实…

Linux|操作系统|如何下载各个版本的centos操作系统

前言&#xff1a; centos做为一个现在比较常用的Linux社区版本&#xff0c;还是比较受欢迎的&#xff0c;那么&#xff0c;如何下载centos的安装包&#xff0c;也就是centos的操作系统呢&#xff1f; 首先&#xff0c;我们应该知道硬件底层有aarch64&#xff0c;ppc64&#x…

【限免】短时傅里叶变换时频分析【附MATLAB代码】

来源&#xff1a;微信公众号&#xff1a;EW Frontier 简介 一种能够同时对信号时域和频域分析的方法——短时傅里叶变换&#xff08;STFT&#xff09;&#xff0c;可以在时频二维角度准确地描述信号 的时间、频域的局部特性&#xff0c;与其他算法不同&#xff0c;通过该算法可…

【Elasticsearch】Centos7安装Elasticsearch、kibana、IK分词

目录 本文安装包下载地址注意安装elasticsearch1.上传文件2.解压elasticsearch-6.3.1.tar.gz3.开启远程连接权限4.修改其他配置[root用户操作]5.重启虚拟机6.启动es7.外部访问 安装kibana-61.解压2.配置3.启动kibana4.访问5.在开发工具中做数据的增删改查操作 安装IK分词1.wind…