c++清空输入缓冲区_干货 | C++的输入输出方法

   C和C++并没有将输入与输出实现在语言中,而是在类库中实现。作为C的超集,C++继承了C的输入输出方法。同时将输入与输出视为字流。流充当了程序和流源流目标之间的桥梁。本文将介绍C++的输入输出方式,并且浅谈C与C++均有的输入输出方式

对C++有一定学习的同学可以很轻松的写出一下代码

8f3ed6b3a09584d5339d0410d13c7773.png

在这段代码中,我们声明了包含了iostream库,声明了整型变量a,访问名词空间std用其中的对象cin在流提取运算符>>的作用下输入了变量a,再次访问名词空间std,其中的对象cout在流插入符的作用下插入变量a到输出流从而输出。

下面我们来浅显的分析一下这段代码。

首先是类库iostream.iostream的意思是输入输出流,直接点说就是in(输入)out(输出)stream(流),取in、out的首字母与stream合成。iostream库的基础是两种命名为istream和ostream的类型,分别表示输入流和输出流。流是指要从某种IO设备上读出或写入的字符序列。术语“流”试图说明字符是随着时间顺序生成或消耗的。标准库定义了4个IO对象。处理输入时使用命名为cin的istream类型对象。这个对象也称为标准输入。处理输出时使用命名为cout的ostream类型对象,这个对象也称为标准输出。标准库还定义了另外两个ostream对象,分别命名为cerr和clog。cerr对象又叫作标准错误,通常用来输出警告和错误信息给程序的使用者。而clog对象用于产生程序执行的一般信息。

f9b513834179f7451872f4dcb5a8f6f9.png

0e298b17937883b963f6bb8c02a5126f.png

一、输入流与输出流的基本操作

输入和输出并不是C++语言中的正式组成成分。C和C++本身都没有为输入和输出提供专门的语句结构。输入输出不是由C++本身定义的,而是在编译系统提供的I/O库中定义的。C++的输出和输入是用“流”(stream)的方式实现的。图3.2和图3.3表示C++通过流进行输入输出的过程。

de5f3d55860cf7a09c80b538e3abe047.png

有关流对象cin、cout和流运算符的定义等信息是存放在C++的输入输出流库中的,因此如果在程序中使用cin、cout和流运算符,就必须使用预处理命令把头文件stream包含到本文件中:

aead1f12cdbd189ae193a71aaf2769de.png

尽管cin和cout不是C++本身提供的语句,但是在不致混淆的情况下,为了叙述方便,常常把由cin和流提取运算符“>>”实现输入的语句称为输入语句或cin语句,把由cout和流插入运算符“<

cout语句的一般格式为:

cout<

cin语句的一般格式为:

cin>>变量1>>变量2>>……>>变量n;

在定义流对象时,系统会在内存中开辟一段缓冲区,用来暂存输入输出流的数据。在执行cout语句时,先把插入的数据顺序存放在输出缓冲区中,直到输出缓冲区满或遇到cout语句中的endl(或'\n',ends,flush)为止,此时将缓冲区中已有的数据一起输出,并清空缓冲区。输出流中的数据在系统默认的设备(一般为显示器)输出。

在用cins输入cout输出时,我们不必通知计算机按何种类型输出,系统会自动判别输出数据的类型,使输出的数据按相应的类型输出。例如

705d12ebfb70730e2a4d014ba4ef422b.png

我们可以同时对整型变量a浮点型b,字符型c,字符串型d进行输入输出。

二、在输入流与输出流中使用控制符

上面我们介绍的是使用cout和cin时的默认格式。但有时人们在输入输出时有一些特殊的要求,如在输出实数时规定字段宽度,只保留两位小数,数据向左或向右对齐等。C++提供了在输入输出流中使用的控制符(有的书中称为操纵符)。

需要注意的是:如果使用了控制符,在程序单位的开头除了要加iostream头文件外,还要加iomanip头文件。

aedc33f10bbb6317053f96f386661cf4.gif例一:输出双精度数

2673fa2ea4ac4101df878394c26d84b0.png

程序结果

e2267820d200fed4636a9880a1108a9a.png

aedc33f10bbb6317053f96f386661cf4.gif例二:整数输出

b007ced2dc712a2a398025c30a7acec0.png

程序结果

53663e32de316c34dd6f091b779a5bc7.png

三:输入的技巧浅谈

下面我们通过几个情景来讲解一部分输入的技巧1输入一行字符,其中含有空格。再次使用cin会再中途遇到空格时停止读入,所以我们可以使用getline函数来完整的读入一行。此函数在库string中。

4ad571b6de3c4437e938ffd09fd79899.png

效果如图

0c92037bedcb0a06f3940c22974d3961.png

其函数原型如下

679fae98c8f3541bd35bbc5ea448e140.png

下面我们简单的分析一下这个函数

01

这个函数返回的是一个流对象,这个暂时我们不讨论,但注意cin返回的亦是一个流对象。然后便是函数的参数,第一个参数是一个istream的输入流对象,这里我们用cin就好。然后便是一个字符串参数,表示我们要把从istream对象输入进来的数据存放在那个字符串里面。最后一个参数是截至字符,表示读到该字符后停止输入,默认为换行字符’\n’

02

输入任意行字符,其中有空格。可以理解为输入一篇文章。将getline函数放入while循环中不断读入。由于getline函数返回一个流对象,所以可以作为bool值进行判断,所以我们就可以不断调用函数,直到没有字符读入为止。

假设文章不超过maxn行

032d3d17734a5a2f11afbbca2090daad.png

be54b2f28ba8add7aa2fce810abeeea4.png

03

读入若干行整数,每行整数数量不确定,求每行的和及输入的整数的个数

解决方案:把读入的一整行字符串再次转换成一条输入流,读入到整数中,将字符串转化成输入流需要包含库sstream

209e5675bd590eaa95e62e37282f2b2c.png

效果图如下

5aa445b0d98edd957ee293027ad8c908.png

输入输出的运算符重载随着编程的复杂程度提升,我们不满足于语言自

带的数据类型,开始定义了类来实现模块化编程,但是如果又追求实现简洁优雅的用cincout 来输入输出对象,这时候我们就可以实现对插入运算符<>的重载来达到我们的目的.

acb18a0699305b15f1d4e990b0263c43.png

然后我们就可以愉快的输入输出student类了

8584e084a954907c5d229200648eea14.png

效果如图

ae31c9624697de84221ef6ed4b031689.png

文件的输入输出到目前为止,我们的输入输出都只是建立再对终端窗口的交互之中。在实际中,更多的是从文件中读入和输出数据。接下来,我们介绍若干种对文件中数据的读入和写入的方式。freopen我们先包含一个包含库cstdio,便可以调用freopen函数,之后我们的输入输出都会重定向到指定文件。

3960c45e5544c5e961feaff035cdf8e9.png

函数原型如下

bf32f240229202ef7136e48bcbd5030e.png

参数说明:

path:文件名,用于存储输入输出的自定义文件名。

mode:文件打开的模式。和fopen中的模式(如r-只读,w-写)相同。

stream:一个文件,通常使用标准流文件。

返回值:成功,则返回一个path所指定文件的指针;失败,返回NULL。功能:实现重定向,把预定义的标准流文件定向到由path指定的文件中。标准流文件:具体是指stdin、stdout和stderr。其中stdin是标准输入流,默认为键盘;stdout是标准输出流,默认为屏幕;stderr是标准错误流,一般把屏幕设为默认。使用fstream声明文件读写变量。

ofstream是从内存到硬盘,

ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间;在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O。

04c0a3826cd5b144c776a582d73a6a74.png

43d383281ac20abb7077c602e5edba7c.png

一、打开文件在fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是:

voidopen(const char* filename,int mode,int access);

filename:要打开的文件名

mode:要打开文件的方式

access:打开文件的属性打开文件的方式在类ios(是所有流式I/O类的基类)中定义,常用的值如下:

ios::app:以追加的方式打开文件

ios::ate:文件打开后定位到文件尾,ios:app就包含有此属性

ios::binary:以二进制方式打开文件,缺省的方式是文本方式。

ios::in:文件以输入方式打开(文件数据输入到内存)

ios::out:文件以输出方式打开(内存数据输出到文件)

ios::nocreate:不建立文件,所以文件不存在时打开失败

ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败

ios::trunc:如果文件存在,把文件长度设为0,可以用“或”把以上属性连接起来,如ios::out|ios::binary

二、关闭文件打开的文件使用完成后一定要关闭,fstream提供了成员函数close()来完成此操作,如:file1.close();把file1相连的文件关闭。

下面是一个简单的示例程序

这个程序我们先把前100个偶数写入到了1.txt文件中,然后再读入求和。如果想了解更多C++的语法和实现,可以参考http://www.cplusplus.com/或者参考C++prime

43d383281ac20abb7077c602e5edba7c.png

abef53e04361233821262dd637de564c.png

 文案:荣思齐

排版:许宗清

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

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

相关文章

Qt应用程序发布:Qt应用程序添加版本版权生产商等信息

设置方法 在QMake Manual手册中搜索关于QMAKE_TARGET内容可以看到有如下QMake变量&#xff1a; QMAKE_TARGET_COMPANY&#xff1a;用于指定生产商QMAKE_TARGET_DESCRIPTION&#xff1a;用于描述应用程序QMAKE_TARGET_COPYRIGHT&#xff1a;用于声明版权QMAKE_TARGET_PRODUCT&…

stl源码剖析_STL源码剖析 阅读笔记(二)allocator

一、空间分配器 allocator从使用上看&#xff0c;空间分配在任何语言的任何组件都不需要我们去过多关心&#xff0c;因为语言、组件的底层肯定都比较完整的做了这件事情。从实现上看&#xff0c;学习 allocator 的原理在源码学习中是首当其冲。因为没有空间分配&#xff0c;则无…

easyexcel将对象处理为多列,自增序列

概述 主要记录在开发中遇到的问题&#xff1a;使用easyexcel导出excel&#xff0c;一般数据都是保存在数据库中&#xff0c;如果查询返回的是一个实体类&#xff0c;且里面有嵌套的实体类对象&#xff0c;这时导出的时候要先对查询出的数据进行业务逻辑处理&#xff0c;让它符…

python做excel表格代码_python操作excel表格

我们在写测试用例的时候&#xff0c;是创建一个表格.xlsx&#xff0c;然后把各种条件加到这张表格中去&#xff0c;所以&#xff0c;如何对excel表格操作&#xff0c;是相当重要的一环&#xff0c;那么&#xff0c;接下来&#xff0c;这篇博客就直接教会大家如何通过python去处…

Windows 查看程序ip地址(面对小白)

前言&#xff1a;Windows自带资源管理器可以查看程序的IP地址。下面以微信通话为例&#xff0c;详细步骤如下(面向小白)&#xff1a; 打开任务管理器 打开方法(以下方法都可以)&#xff1a; 键盘按住 【ctrl】 【alt】 【delete】 ,选择【任务管理器】Windows 10 以下系统…

【转】C#中相同不同程序集存在相同的命名空间的时候的冲突解决办法

快速解决办法描述描述: 1.将相同命名空间的不同程序集分别进行取别名&#xff1a;【具体操作:右击相同程序的引用&#xff0c;在别名上修改&#xff0c;默认的为global】。 2.调用&#xff1a;在所在调用文件里面最前面写 extern alias 别名&#xff0c;然后using 别名.Names…

chrome webdriver_(最新版)如何正确移除Selenium中的 window.navigator.webdriver

摄影&#xff1a;产品经理产品经理的三文鱼炒饭在《一日一技&#xff1a;如何正确移除Selenium中window.navigator.webdriver的值》一文中&#xff0c;我们介绍了在当时能够正确从Selenium启动的Chrome浏览器中移除window.navigator.webdriver的方法。后来时过境迁&#xff0c;…

【转】2.3async中必须始终返回Task(@Ron.liang)

Asp.Net Core 轻松学-经常使用异步的你,可能需要看看这个文章 目录 前言1. 异常的发生来得太突然2. 问题所在3. 问题的解决方案前言 事情的起因是由于一段简单的数据库连接代码引起&#xff0c;这段代码从语法上看&#xff0c;是没有任何问题&#xff1b;但是就是莫名其妙的报…

php隐藏webshell_PHP 安全的十个必备技巧

在这篇文章中&#xff0c;我将尝试为你提供一些可以提高 PHP 应用程序安全性的具体步骤。我关注的是 PHP 配置本身&#xff0c;所以我们不会讨论 SQL 注入、HTTPS 或其他与 PHP 无关的问题。我将使用我的 docker-entrypoint.sh 脚本中的 bash 行来说明示例&#xff0c;但当然你…

aop实现原理_Java:由浅入深揭开 AOP 实现原理

点击上方“Java专栏”&#xff0c;选择“置顶或者星标”第一时间阅读精彩文章&#xff01;1、☞ 程序员进阶必备资源免费送「21种技术方向&#xff01;」 点击查看☜2、☞ 《Java面试手册》.PDF 点击查看作者&#xff1a;马佩juejin.im/post/5bf4fc84f265da611b57f906概述&a…

【转】C#进阶系列——WebApi 接口参数不再困惑:传参详解

阅读目录 一、get请求 1、基础类型参数2、实体作为参数3、数组作为参数4、“怪异”的get请求二、post请求 1、基础类型参数2、实体作为参数3、数组作为参数4、后台发送请求参数的传递三、put请求 1、基础类型参数2、实体作为参数3、数组作为参数四、delete请求五、总结正文 前…

【转】01Teams的前世今生

说到Teams&#xff0c;这到底是一个什么产品&#xff1f;有人说它是团队协作工具&#xff0c;有人说它是云视频系统&#xff0c;有人说它是Hub&#xff0c;还有人说它是微软有史以来发展最快的一个产品&#xff0c;还有人说它完全是一个高效办公神器。其实都是对的。 Teams集成…

oracle insert 当前时间_Oracle知识点总结

目录1、Oracle的安装与下载2、基础查询3、条件查询 1)对比运算符 2)逻辑运算符 3)模糊查询 4)排序4、函数 1)数值函数 2)字符函数 3)时间日期函数 4)转换函数 5)通用函数5、聚合函数6、分组查询在学习Oracle之前&#xff0c;需要先有一定的数据库基…

【转】C#各类控件的输入输出(思维导图、知识点分析、案例解析)

第六周学习笔记—C#各类控件的输入输出 1.思维导图 知识点汇总&#xff1a; 着重介绍几个常用控件&#xff1a; 数据显示控件 DataGridView控件 列设置 a)、列的宽度铺满这个控件 设置如下&#xff1a;把AutoSizeColumnsModeFill;//可以在属性窗口中设置 b)、列名居中 代…

sqlserver连接字符串_10分钟使用EF Core连接MSSQL数据库

(给DotNet加星标&#xff0c;提升.Net技能)转自&#xff1a;Ron.liangcnblogs.com/viter/p/10243577.html前言在 .NET Core 2.2中Microsoft.AspNetCore.App 默认内置了EntityFramework Core 包&#xff0c;所以在使用过程中&#xff0c;我们无需再从NuGet仓库单独应用 EFCore 包…

【转】ADO.Net之SqlConnection、 Sqlcommand的应用学习心得(思维导图,知识解析,案例分析)

ADO.Net之SqlConnection、 Sqlcommand的应用 一、思维导图&#xff1a; ADO.NET与SQL连接&#xff1a; 二、知识点介绍&#xff1a; SqlConnection和Sqlcommand都是组成数据提供程序的类。 SqlConnection使用它来建立和数据库的连接&#xff0c;Sqlcommand使用它执行SQL命令…

professional中文_Microsoft office 2007 简体中文版

点击蓝字 关注小白软件名称&#xff1a;Microsoft office 2007软件语言&#xff1a;简体中文软件大小&#xff1a;0.67GB安装环境&#xff1a;Win10/8/7下载链接&#xff1a;https://pan.baidu.com/s/1DybozQ-rn-t2s2EC7FrvFw 提取码&#xff1a;zoa0安装步骤1、解压安装包&…

【转】设计模式 ( 十七) 状态模式State(对象行为型)

设计模式 ( 十七) 状态模式State&#xff08;对象行为型&#xff09; 1.概述 在软件开发过程中&#xff0c;应用程序可能会根据不同的情况作出不同的处理。最直接的解决方案是将这些所有可能发生的情况全都考虑到。然后使用if... ellse语句来做状态判断来进行不同情况的处理。…

【OSG学习】准备开发调试环境

环境 本人当前使用的环境是VS2013 Ultimate Update5 WIN10。 OSG编译安装 下载编译OSG源码不要克隆github上的源码&#xff0c;而是下载稳定版本的OSG源码进行编译。因为github上的源码处于开发阶段&#xff0c;我们应该优先选择稳定版本&#xff0c;我使用的是OpenSceneGr…

【Qt开发经验】Qt信号槽连接不成功问题原因汇总

以下几种情况会导致信号槽连接不成功&#xff0c;下面分别描述。 1. 拥有信号槽的类&#xff0c;必须继承QObject&#xff0c;声明Q_OBJECT宏。 Qt帮助手册里搜索 “Signals & Slots”&#xff0c;可以看到以下说明&#xff1a; 想要使用信号槽&#xff0c;必须继承QOb…