2.5 数据输入与输出
在用户与计算机进行交互的过程中,数据输入与输出是必不可少的操作过程,计算机需要通过输入来获取用户的操作指令,并通过输出来显示操作结果。本节将介绍数据输入与输出的相关内容。
2.5.1 控制台屏幕
在NT内核的Windows操作系统中为保留DOS系统的风格,提供了控制台程序,选择“开始”→“运行”,打开“运行”对话框,在“打开”文本框中输入cmd.exe之后,按Enter键,可以启动控制台程序。在控制台中可以运行DIR、CD、DELETE等DOS系统中的文件操作命令,也可以用来启动Windows的程序。控制台屏幕如图2.19所示。
图2.19 控制台屏幕
使用Visual C++6.0创建的控制台工程的程序都将运算结果输出到如图2.16 所示的控制台屏幕中,它是程序显示输出结果的地方。
2.5.2 C++语言中的流
在C++语言中,数据的输入与输出包括标准输入/输出设备(键盘、显示器)、外部存储介质(硬盘)中的文件和内存的存储空间。对标准输入设备和标准输出设备的输入/输出简称为标准I/O,对硬盘中文件的输入/输出简称为文件I/O,对内存中指定的字符串存储空间的输入/输出简称为串I/O。
在C++语言中,我们把数据之间的传输操作称为流。流既可以表示数据从内存传送到某个载体或设备中,即输出流,也可以表示数据从某个载体或设备传送到内存缓冲区变量中,即输入流。C++语言中的所有流都是相同的,但文件可以不同。使用流以后,程序利用流统一对各种计算机设备和文件进行操作,从而提高了程序设计的通用性和灵活性。
C++语言定义了I/O类库供用户使用,标准I/O操作有4个类对象,它们分别是cin、cout、cerr和clog。其中,cin表示标准输入设备键盘,也称为cin流或标准输入流;cout表示标准输出显示器,也称为cout流或标准输出流。当使用键盘输入操作时使用cin流,当使用显示器输出操作时使用cout流,当使用错误信息输出操作时使用cerr或clog。
在C++语言中,流通过运算符“<<”和“>>”执行输入和输出操作。输出操作是向流中插入一个字符序列,因此,在流操作中,将左移运算符“<<”称为插入运算符。输入操作是从流中提取一个字符序列,因此,将右移运算符“>>”称为提取运算符。C++程序的输出示意图如图2.20所示。
图2.20 C++程序的输出示意图
1.cout语句的语法格式
cout表示显示器,执行cout<<x操作就相当于把x的值输出到显示器中。
首先把x的值输出到显示器中,在当前光标位置显示出来,然后cout流恢复到等待输出的状态,以便继续通过插入运算符输出下一个值。当使用插入运算符输出一个值后,再输出下一个值时,将被紧接着放在上一个值的后面,所以为了使流中的前后两个值分开,可以在输出一个值后接着输出一个空格或一个换行符,也可以是其他所需要的字符或字符串。
一个cout语句可以分写成若干行,例如:
也可写成多个cout语句:
以上3种形式的输出语句都是正确的。
2.cin语句的语法格式
执行cin>>x就相当于把键盘输入的数据赋值给变量。
当从键盘上输入数据时,只有当输入完数据并按Enter键后,系统才会把该行数据存储到键盘缓冲区,供cin流按顺序读取给变量。另外,从键盘上输入的每个数据之间必须用空格或回车符分开,因为cin为一个变量读入数据时是以空格或回车符作为其结束标志的。
注意:在cin>>x操作中,当x为字符指针类型时,要求从键盘输入的数据中读取一个字符串,并把它赋值给x所指向的存储空间,如果x没有事先指向一个允许写入信息的存储空间,则无法完成输入操作。另外,从键盘上输入的字符串,其两边不能带有双引号定界符,如果有双引号定界符,则只作为双引号字符看待。对于输入的字符也是如此,不能带有单引号定界符。
cin()函数相当于C++语言中的scanf()函数,将用户输入的数据赋值给变量,代码如下:
输出HelloWorld字符串,代码如下:
程序运行结果如图2.21所示。
图2.21 输出HelloWorld
endl是向流的末尾加入换行符。i是一个整型变量,在输出流中自动将整型变量转换成字符串输出。
2.5.3 流输出格式的控制
1.cout输出格式控制
在iomanip.h头文件中定义了一些控制流输出格式的函数,在默认情况下,整型数据可以按十进制形式输出,也可以通过hex将其设置为十六进制形式输出。流操作控制的具体函数如表2.9所示。
表2.9 流操作控制的具体函数
数据输入/输出的格式控制还有更简捷的形式,就是使用 iomainip.h 头文件中提供的运算符。使用这些运算符不需要调用成员函数,只要把它们作为插入运算符的输出对象即可。
● dec:转换为按十进制形式输出整数,是默认的输出格式。
● oct:转换为按八进制形式输出整数。
● hex:转换为按十六进制形式输出整数。
● ws:从输出流中读取空白字符。
● endl:输出换行符“\n”并刷新流。刷新流是指把流缓冲区中的内容立即写入对应的物理设备上。
● ends:输出一个空字符“\0”。
● flush:只刷新一个输出流。
控制打印格式,代码如下:
程序运行结果如图2.22所示。
2.printf()函数输出格式控制
C++语言还保留着C语言中的输出函数printf()。使用printf()函数可以将任意类型的数据输入到屏幕中。printf()函数的语法格式如下:
printf()是变参函数,在数值列表中可以有多个数值,数值的个数不是确定的,每个数值之间使用逗号隔开;控制格式表示数值以哪种格式输出,控制格式的数量要与数值的个数一致,否则程序运行时会产生错误。
图2.22 控制打印格式
控制格式是由%和特定字符构成的,其语法格式如下:
*表示可以使用占位符。域宽表示输出的长度,如果输出的内容没有域宽长,则使用占位符占位;如果输出的内容比域宽长,则按实际内容输出,以适应域宽。长度表示输出内容的长度,如%d表示以整型数据格式输出。输出类型如表2.10所示。
表2.10 输出类型
部分格式字符的详细说明如下。
(1)d格式字符,以十进制形式输出整数。有以下几种用法。
●%d,按整型数据的实际长度输出。
●%*md,m为指定的输出字段的宽度。如果数据的位数小于m,则用*所指定的字符占位,如果*未指定字符占位,则用空格占位;如果数据的位数大于m,则按实际位数输出。
●%ld,输出长整型数据。
(2)o格式字符,以八进制形式输出整数。有以下几种用法。
●%o,按整型数据的实际长度输出。
●%*mo,m为指定的输出字段的宽度。如果数据的位数小于m,则用*所指定的字符占位,如果*未指定字符占位,则用空格占位;如果数据的位数大于m,则按实际位数输出。
●%lo,输出长整型数据。
(3)x格式字符,以十六进制形式输出整数。有以下几种用法。
●%x,按整型数据的实际长度输出。
●%*mx,m为指定的输出字段的宽度。如果数据的位数小于m,则用*所指定的字符占位,如果*未指定字符占位,则用空格占位;如果数据的位数大于m,则按实际位数输出。
●%lx,输出长整型数据。
(4)s格式字符,用来输出一个字符串。有以下几种用法。
●%s,将字符串按实际长度输出。
●%*ms,输出的字符串占m列。如果字符串长度大于m,突破m的限制,则用*所指定的字符占位,如果*未指定字符占位,则用空格占位;如果字符串长度小于 m,则左侧补空格。
●%-ms,如果字符串长度小于m,在m列范围内,则字符串向左靠,右侧补空格。
●%m.ns,输出的字符串占m列,但只取字符串中左侧n个字符。这n个字符输出在m列的右侧,左侧补空格。
●%-m.ns,输出的字符串占m列,但只取字符串中左侧n个字符。这n个字符输出在m列的左侧,右侧补空格。
(5)f格式字符,以小数形式输出实型数据。有以下几种用法。
●%f,不指定字段宽度,整数部分全部输出,小数部分输出6位。
●%m.nf,输出的数据占m列,其中有n位小数。如果数值长度小于m,则左侧补空格。
●%-m.nf,输出的数据占m列,其中有n位小数。如果数值长度小于m,则右侧补空格。
(6)e格式字符,以指数形式输出实型数据。有以下几种用法。
●%e,不指定输出数据所占的宽度和小数位数。
●%m.ne,输出的数据占m位,其中有n位小数。如果数值长度小于m,则左端补空格。
●%-m.ne,输出的数据占m位,其中有n位小数。如果数值长度小于m,则右端补空格。
使用printf()函数输出相关数据,代码如下:
程序运行结果如图2.23所示。
图2.23 使用printf()函数输出相关数据