C和C++并没有将输入与输出实现在语言中,而是在类库中实现。作为C的超集,C++继承了C的输入输出方法。同时将输入与输出视为字流。流充当了程序和流源流目标之间的桥梁。本文将介绍C++的输入输出方式,并且浅谈C与C++均有的输入输出方式
对C++有一定学习的同学可以很轻松的写出一下代码
在这段代码中,我们声明了包含了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对象用于产生程序执行的一般信息。
一、输入流与输出流的基本操作
输入和输出并不是C++语言中的正式组成成分。C和C++本身都没有为输入和输出提供专门的语句结构。输入输出不是由C++本身定义的,而是在编译系统提供的I/O库中定义的。C++的输出和输入是用“流”(stream)的方式实现的。图3.2和图3.3表示C++通过流进行输入输出的过程。
有关流对象cin、cout和流运算符的定义等信息是存放在C++的输入输出流库中的,因此如果在程序中使用cin、cout和流运算符,就必须使用预处理命令把头文件stream包含到本文件中:
尽管cin和cout不是C++本身提供的语句,但是在不致混淆的情况下,为了叙述方便,常常把由cin和流提取运算符“>>”实现输入的语句称为输入语句或cin语句,把由cout和流插入运算符“<
cout语句的一般格式为:cout<
cin语句的一般格式为:cin>>变量1>>变量2>>……>>变量n;
在定义流对象时,系统会在内存中开辟一段缓冲区,用来暂存输入输出流的数据。在执行cout语句时,先把插入的数据顺序存放在输出缓冲区中,直到输出缓冲区满或遇到cout语句中的endl(或'\n',ends,flush)为止,此时将缓冲区中已有的数据一起输出,并清空缓冲区。输出流中的数据在系统默认的设备(一般为显示器)输出。
在用cins输入cout输出时,我们不必通知计算机按何种类型输出,系统会自动判别输出数据的类型,使输出的数据按相应的类型输出。例如
我们可以同时对整型变量a浮点型b,字符型c,字符串型d进行输入输出。
二、在输入流与输出流中使用控制符
上面我们介绍的是使用cout和cin时的默认格式。但有时人们在输入输出时有一些特殊的要求,如在输出实数时规定字段宽度,只保留两位小数,数据向左或向右对齐等。C++提供了在输入输出流中使用的控制符(有的书中称为操纵符)。
需要注意的是:如果使用了控制符,在程序单位的开头除了要加iostream头文件外,还要加iomanip头文件。
例一:输出双精度数程序结果
例二:整数输出程序结果
三:输入的技巧浅谈
下面我们通过几个情景来讲解一部分输入的技巧1输入一行字符,其中含有空格。再次使用cin会再中途遇到空格时停止读入,所以我们可以使用getline函数来完整的读入一行。此函数在库string中。
效果如图
其函数原型如下
下面我们简单的分析一下这个函数
01这个函数返回的是一个流对象,这个暂时我们不讨论,但注意cin返回的亦是一个流对象。然后便是函数的参数,第一个参数是一个istream的输入流对象,这里我们用cin就好。然后便是一个字符串参数,表示我们要把从istream对象输入进来的数据存放在那个字符串里面。最后一个参数是截至字符,表示读到该字符后停止输入,默认为换行字符’\n’
02输入任意行字符,其中有空格。可以理解为输入一篇文章。将getline函数放入while循环中不断读入。由于getline函数返回一个流对象,所以可以作为bool值进行判断,所以我们就可以不断调用函数,直到没有字符读入为止。
假设文章不超过maxn行
03读入若干行整数,每行整数数量不确定,求每行的和及输入的整数的个数
解决方案:把读入的一整行字符串再次转换成一条输入流,读入到整数中,将字符串转化成输入流需要包含库sstream
效果图如下
四
输入输出的运算符重载随着编程的复杂程度提升,我们不满足于语言自
带的数据类型,开始定义了类来实现模块化编程,但是如果又追求实现简洁优雅的用cincout 来输入输出对象,这时候我们就可以实现对插入运算符<>的重载来达到我们的目的.
然后我们就可以愉快的输入输出student类了
效果如图
文件的输入输出到目前为止,我们的输入输出都只是建立再对终端窗口的交互之中。在实际中,更多的是从文件中读入和输出数据。接下来,我们介绍若干种对文件中数据的读入和写入的方式。freopen我们先包含一个包含库cstdio,便可以调用freopen函数,之后我们的输入输出都会重定向到指定文件。
函数原型如下
参数说明:
path:文件名,用于存储输入输出的自定义文件名。
mode:文件打开的模式。和fopen中的模式(如r-只读,w-写)相同。
stream:一个文件,通常使用标准流文件。
返回值:成功,则返回一个path所指定文件的指针;失败,返回NULL。功能:实现重定向,把预定义的标准流文件定向到由path指定的文件中。标准流文件:具体是指stdin、stdout和stderr。其中stdin是标准输入流,默认为键盘;stdout是标准输出流,默认为屏幕;stderr是标准错误流,一般把屏幕设为默认。使用fstream声明文件读写变量。
ofstream是从内存到硬盘,
ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间;在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O。
一、打开文件在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
文案:荣思齐
排版:许宗清