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,一经查实,立即删除!

相关文章

【转】c# 命名空间和程序集

命名空间&#xff1a;用于对相关的类型进行逻辑分组&#xff0c;使用命名空间有利于方便定位一个类型 使用类的全权名&#xff1a; System.Text.StringBuilder sb new System.Text.StringBuilder(); 上面的写法很繁琐&#xff0c;使用using语句引入命名空间&#xff1a; usin…

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

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

SM4前后端数据传输整体加密

1.SM所需包 pom <!--sm加密--><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.69</version></dependency><dependency><groupId>com.alibaba</gr…

QWidget::size()和QResizeEvent::size()不一定相同!

问题发现 QGraphicsView中将画布设置为和视图相同大小需要使用e->size()&#xff0c;用this->size()会出现滚动条&#xff01; Qt手册中说&#xff0c; QWidget::size()是窗口大小&#xff08;不包括边框&#xff09;&#xff0c;e->size()是可视区域大小&#xff0…

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

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

【转】C#中的命名空间namespace全解

.NET Framework 类库提供下列命名空间&#xff1a; 【Microsoft】 Microsoft.CSharp 包含支持用 C# 语言进行编译和代码生成的类。 Microsoft.JScript 包含支持用 JScript 语言进行编译和代码生成的类。 Microsoft.VisualBasic 包含支持用 Visual Basic .NET 语言进行编译和…

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

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

Qt-VS开发:解决VS中使用带有信号槽的导出对象库时,信号槽不工作的问题

解决办法 需要把导出库的头文件加入到调用此动态库的项目中&#xff0c;只加入到搜索目录中是不行的。 加入到项目中后&#xff0c;VS会自动生成moc_xxx.cpp文件&#xff0c;可以在GeneratedFiles/Debug或GeneratedFile/Release中找到&#xff0c;必须有文件才能实现信号槽。

C# 编程规范

一、命名 1.用pascal规则来命名方法和类型. publicclass TextBox { publicvoid DataBind() { } } 2.用camel规则来命名局部变量和方法的参数&#xff0c; string strUserName;public AddUser(string userId, byte[] passWord); (并加前缀 数据类型&#xff0c;可选。)s…

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 以下系统…

解决Qt graphis-view框架中,上层图元接收hover事件导致底层图元接收不到的问题

问题重现 两个图元&#xff0c;一个在上面&#xff0c;名为item_up&#xff0c;一个在下面&#xff0c;名为item_below。 当item_up->setAcceptHoverEvents(true)时&#xff0c;item_up可以接收到鼠标悬停事件&#xff08;hoverEnter&#xff0c;hoverMove&#xff0c;hove…

【转】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;但是就是莫名其妙的报…

Qt事件传递相关问题

事件传递 涉及到深层次窗口结构或者窗口封装时&#xff0c;经常会遇到上层窗口接收不到事件的问题。排除这类问题需要了解窗口间的事件传递过程。 应用程序产生事件时&#xff0c;事件会先派发给父窗口&#xff0c;由父窗口在内部派发给子窗口&#xff0c;子窗口会进一步传递…

tableau 实战练习数据源分享_小白入行数据分析师3年-工作内容复盘分享含代码(二)-数据库及Tableau篇介绍...

前言本文是对使用的数据库以及Tableau的内容进行介绍&#xff0c;方便学习者了解数据库方向有哪些内容是需要有所了解以及可以注意的&#xff0c;分享内容基于个人对这些技能的理解&#xff0c;如有错误请及时指出&#xff0c;我会立马改进。数据库篇数据库这边&#xff0c;我的…

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

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

【转】WebSocket协议:5分钟从入门到精通

一、内容概览 由于WebSocket的出现&#xff0c;使得浏览器也具备了实时双向通信的能力。本文由浅入深&#xff0c;介绍了WebSocket建立连接、交换数据的细节&#xff0c;以及数据帧的格式。此外&#xff0c;还简要介绍了针对WebSocket的安全攻击&#xff0c;以及协议是如何抵御…

Qt填坑

Q_ASSERT里面不要放需要执行的语句&#xff0c;否则release下此语句不会被执行。父类中含Q_OBJECT&#xff0c;子类并不能使用信号槽机制&#xff0c;子类也需要加Q_OBJECT。QStringLiteral只能在Qt 5及以上版本中使用&#xff0c;低版本不支持。如果需要Qt 5及以上版本的代码放…