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

news2025/4/4 21:55:24

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

        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;									//定义变量input
	std::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(){
	// 定义PI
	double 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.coloradmin.cn/o/1697179.html

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

相关文章

消费者相关高效读写ZK作用

消费者分区分配策略 目录概述需求&#xff1a; 设计思路1.消费者分区分配策略2. 消费者offset的存储3. kafka消费者组案例4. kafka高效读写&Zk作用5. Ranger分区再分析 实现思路分析 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show …

学习存储协议的利器,聊聊tcpdump和Wireshark

数据存储技术分为多个方面,包括数据持久化、数据映射、数据压缩和通信协议等等。其中通信协议是数据存储技术中非常重要的一部分,正是通信协议使得计算节点可以访问存储设备。同时,也正是不同的协议让存储系统呈现不同的形态。 如下图所示,通过iSCSI协议,可以将存储端的存…

解决Vue3+TS+vite,VSCode 高亮语法错误

一般像这种提示&#xff0c;有可能就是TypeScript语法的识别问题&#xff0c; 一般我们重装一下Vue - Official插件 或者将tcconfig.json中的moduleResolution改为node模式&#xff0c; 基本都是TypeScript无法识别vue文件中的TypeScript语句导致的

22款奔驰GLE450升级原厂AMG阀门运动排气声浪

提升车辆外观&#xff1a;空气悬挂系统可以调节车辆的高度&#xff0c;使车身更接近地面或提高离地间隙&#xff0c;从而改变车辆外观&#xff0c;增加个性化和独特性。 改善驾驶舒适性&#xff1a;空气悬挂系统具有更好的减震效果&#xff0c;可以提供更舒适的驾驶体验&#…

Ant design vue的表格双击编辑功能(即双击开始编辑并自动获得焦点,失去焦点时完成编辑)

本文基于Ant Design Vue官方网站的表格&#xff08;可编辑单元格&#xff09;&#xff08;表格 Table - Ant Design Vue (antdv.com))中的样板代码获得双击编辑且获得焦点、失去焦点时完成编辑的功能。 要点&#xff1a; &#xff08;1&#xff09;双击时候实现编辑&#xff…

docker同步bilibili收藏视频到群晖,可配合emby

作者是amtoaer&#xff0c;在github项目地址&#xff1a;https://github.com/amtoaer/bili-sync 有两个版本&#xff0c;1.0和2.0&#xff0c;我使用的是2.0 PS2&#xff1a;2.0和1.0版本目录结构不兼容&#xff0c;所以部署后会全量重新下载视频。 演示&#xff1a; 依然是…

解析售后维修服务平台如何助力企业高效运营与决策

随着生活质量的不断提高&#xff0c;人们对于售后服务的要求也越来越多。因此&#xff0c;售后服务已经成为企业竞争力的重要组成部分。售后服务平台作为连接企业与消费者的桥梁&#xff0c;不仅关乎着消费者的满意度&#xff0c;而且直接影响着企业的品牌形象与市场地位。那么…

用实践结果告诉你为啥说 CloudFlare 是赛博菩萨?

最近几天明月都没有更新博客了,主要是接了几个 CloudFlare 代维配置的活儿,有需要加速优化的,有需要排除疑难故障的,有需要提高防御攻击能力的甚至还有纯粹为了体验“打不死”装逼需要的。总之,各种各样的需求,五花八门的,好在 CloudFlare 都能一一满足,最主要的是这些…

VBA技术资料MF157:创建每个标题的目录

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

(Java面试题分享)万里长征-03-搜狐

万里长征-03-搜狐 ⚙ 以下内容基于GPT-4o模型 问题 1.LeetCode103 二叉树的锯齿形层序遍历 103. 二叉树的锯齿形层序遍历 - 力扣&#xff08;LeetCode&#xff09; 2.LeetCode5 最长回文子串 5. 最长回文子串 - 力扣&#xff08;LeetCode&#xff09; 3.Kafka为何那么快 …

Leetcode刷题笔记3:链表基础1

导语 leetcode刷题笔记记录&#xff0c;本篇博客记录链表基础1部分的题目&#xff0c;主要题目包括&#xff1a; 203.移除链表元素707.设计链表206.反转链表 知识点 链表 链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据…

vue3 依赖-组件tablepage-vue3版本1.1.2~1.1.5更新内容

github求⭐ 可通过github 地址和npm 地址查看全部内容 vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例-汇总 vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅰ&#…

002 仿muduo库实现高性能服务器组件_整体框架

​&#x1f308;个人主页&#xff1a;Fan_558 &#x1f525; 系列专栏&#xff1a;仿muduo &#x1f339;关注我&#x1f4aa;&#x1f3fb;带你学更多知识 文章目录 前言项目框架小结 前言 本文不会包含任何项目模块的代码&#xff0c;旨在向你介绍项目具体分为哪几个模块&am…

跨平台之用VisualStudio开发APK嵌入OpenCV(二)

开始干 新建解决方案&#xff0c;新建动态库&#xff08;Android&#xff09;项目 功能随便选一个吧&#xff0c;就模仿PS&#xff08;Photoshop&#xff09;的透视裁切功能&#xff0c;一个物体&#xff08;比如扑克牌&#xff09;透视图&#xff0c;选4个顶点&#xff0c;转…

上位机图像处理和嵌入式模块部署(f103 mcu和Qt上位机联动)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 之前我们写过一篇文章​​​​​​​&#xff0c;上面说的是如何利用串口对mcu进行控制&#xff0c;即如果利用串口实现mcu led灯的点亮和熄灭。输…

小程序迁移主体变更流程全攻略

小程序迁移变更主体有什么作用&#xff1f;有些小程序开发者&#xff0c;因为业务调整&#xff0c;或者公司更换&#xff0c;需要更换小程序主体&#xff01;但是很多开发者对于小程序更换主体的操作流程并不熟悉&#xff0c;于是我们专门准备了这篇&#xff0c;关于小程序更换…

性能测试学习(一)

一、概念 1.性能测试&#xff1a;使用自动化工具&#xff0c;模拟不同场景&#xff0c;对软件各项性能指标进行测试和评估的过程 2.包括&#xff1a;a.后台处理程序的性能&#xff1b;b.应用服务器、数据库、架构设计是否存在瓶颈&#xff1b;c.服务器资源消耗(CPU、内存、磁…

ISCC——AI

得到一个T4.pyc 回编译一下 得到下面代码 import base64def encrypt_and_compare(user_input, offset_str, target_base64):if len(user_input) ! 24:return Please enter a string with a length of 24encrypted Nonefor i, char in enumerate(user_input):offset int(off…

二元关系表示

一、二元关系的定义和表示 什么是二元关系&#xff1f;对集合A和B&#xff0c;A\timesB的任意子集R为A到B的一个二元关系。当AB时&#xff0c;A\timesA的任一子集R称为A上的一个二元关系。在不引起误解的情况下&#xff0c;二元关系可简称关系。 若|A|m,|B|n&#xff0c;则A到…