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

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

0 1

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

0 2

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

假设文章不超过maxn行

032d3d17734a5a2f11afbbca2090daad.png

be54b2f28ba8add7aa2fce810abeeea4.png

0 3

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

解决方案:把读入的一整行字符串再次转换成一条输入流,读入到整数中,将字符串转化成输入流需要包含库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

 文案:荣思齐

排版:许宗清

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值