您的位置:首页 > 编程语言 > C语言/C++

VC中C++的输入输出I/O 流函数

2012-12-23 03:53 483 查看
(1)什么是“流”?

C++中的“流”(stream)是一种抽象,它表示数据从源端流向目的端。

输入流(Input Stream)表示的是数据从输入设备(如键盘、磁盘等)流向内存,输出流(Output Stream)表示的是数据从内存流向输出设备(如屏幕、打印机、磁盘等)。输入输出流(I/O Stream)是输入流和输出流的合称。

“流”中的内容可以是任意形式的数据,例如:ASCII字符、二进制形式的数据、图形、图像、声音等信息。

(2)C++将输入输出流(简称I/O流)分成三种类型:

标准输入输出流:流向标准输入输出设备(即键盘、显示器)的数据;

文件输入输出流:流向外存磁盘文件的数据;

字符串输入输出流:对内存中指定的空间(通常用一个字符数组作为存储空间)进行输入输出操作,流向这里的数据。

我们只对标准输入输出流、文件输入输出流进行讨论,对字符串输入输出流不作介绍。

(3)输入输出的类、类库

流类:在C++中定义的实现I/O的类;

流库:多个流类及其类层次集合;

C++中的流类由两类平行基类ios和streambuf组成,所有流类都通过这两个基类派生出来。

ios类是所有ios类层次的基类,提供输入/输出所需要的公共操作。

(1)输出流对象

cout:输出基本类型数据时,不必考虑数据是什么类型,系统会自动判断,选择相应的重载函数;输出用户自己定义的类型数据时,要重载<<运算符(具体见第8讲内容);

cerr:是在屏幕上显示出错信息,与cout用法类似,不同的是只能在屏幕上,而不能在磁盘文件上输出错误信息;

clog:用法与cerr类似,不同点是它带有缓冲区。

(2)格式输出

1)用格式控制符控制输出

输出不同进制的数:dec(十进制)、hex(十六进制)、oct(八进制)

例:

int n=20;

cout<<"设置进制: "<<endl;

cout<<"十进制: "<<n<<endl;

cout<<"十六进制: "<<hex<<n<<endl;

cout<<"八进制: "<<oct<<n<<endl;

cout<<"十进制: "<<dec<<n<<endl;

设置域宽:setw(n), n小于实际宽度时,按实际宽度输出,它一次只控制一个数值输出。

例:

int m=1234;

cout<<"设置域宽: "<<endl;

cout<<setw(3)<<m<<endl;

cout<<setw(5)<<m<<endl;

cout<<setw(10)<<m<<endl;

设置填充字符:setfill(c),需要与setw(n)合用

例:

int m=1234;

cout<<"设置填充字符: "<<endl;

cout<<setfill(‘*’)<<setw(5)<<m<<endl;

cout<<setw(10)<<m<<endl;

设置对齐方式:setiosflags(ios::left)(左对齐)、setiosflags(ios::right)(右对齐)

int m=1234;

cout<<"设置对齐方式"<<endl;

cout<<setfill(' ');

cout<<setiosflags(ios::left)<<setw(10)<<m<<endl;

cout<<setiosflags(ios::right)<<setw(10)<<m<<endl;

强制显示小数点和尾0:setiosflags(ios::showpoint)

强制显示符号:setiosflags(ios::showpos)

double d1=10/5,d2=22.0/7;

cout<<"显示小数点、尾和数符: "<<endl;

cout<<d1<<endl;

cout<<setiosflags(ios::showpoint)<<d1<<endl;

cout<<setiosflags(ios::showpos)<<d2<<endl;

cout<<resetiosflags(ios::showpos);

设置浮点数的输出是以科学记数法还是定点数

setiosflags(ios::scientific)(科学记数法)

setiosflags(ios::fixed)(定点数)

double dd=123.4567;

cout<<setiosflags(ios::scientific)<<dd<<endl;

cout<<setiosflags(ios::fixed)<<dd<<endl;

设置精度(有效数字):setpreciion(n)自动四舍五入

double dd=123.4567;

cout<<setprecision(2)<<dd<<endl;

cout<<setprecision(3)<<dd<<endl;

cout<<setprecision(4)<<dd<<endl;

cout<<setprecision(5)<<dd<<endl;

输出十六进制数时控制英文字母的大小写:setiosflags(ios::uppercase)

int num=510;

cout<<"以大小写方式输出进制数: "<<endl;

cout<<"16进制数(默认:小写方式):"<<hex<<num<<endl;

cout<<"以大写方式输出进制数: "<<setiosflags(ios::uppercase)<<hex<<num<<endl;

cout<<"恢复小写方式输出进制数: "<<resetiosflags(ios::uppercase)<<hex<<num<<endl;

程序运行结果:

以大小写方式输出进制数:

16进制数(默认:小写方式):1fe

以大写方式输出进制数:1FE

恢复小写方式输出进制数: 1fe



(3) 用流成员函数put()输出字符

格式: put(字符型)

功能:输出单一个字符

//例13-2 用流成员函数put()反序输出一个字符串

#include <iostream>

using namespace std;

void main()

{

char str[]="Programming with C++";

for( int i=sizeof(str)/sizeof(str[0])-2 ; i>=0; i--)

cout.put(*(str+i));

cout.put('\n');

}

在C++中,默认的标准输入设备是键盘,在iostream文件中定义了cin输入流对象。

cin对象与提取运算符>>、变量名或数组名一起构成输入语句,形式为C++的格式化输出

:cin>>…>>…>>…;,能够连续输入多项内容。只要是基本数据类型,不管是int、double、float,还是char、char *等,都可以写成这种形式,这给用户提供了很大的方便。如果要输入用户自己定义的类型数据,就要用友元方式重载>>运算符,有关这方面内容在第8讲已有介绍。

(2) 用于字符输入的流成员函数

1)get( )函数

get的含义是“获取,得到”的意思,在C++中,get()函数的用法很灵活,既可以输入一个字符,也可以输入一串字符,而且内容还可以是回车、tab、空格等空白字符。它有三种形式:

a)不带参数的get()函数

格式:cin.get()

功能:读入一个字符(包括回车、tab、空格等空白字符)

char ch;

while( (ch=cin.get()) !=EOF) //EOF为文件结束符,按ctrl+z 输入

cout.put(ch);

b)带一个参数的get()函数

格式:cin.get(ch)

功能:读入一个字符,如果读取成功则返回非0值(真),如失败(遇到文件结束符)则函数返回0值(假)。

改写上一例:

char ch;

while(cin.get(ch))

{ cout.put(ch); }

c)带三个参数的get()函数

格式:cin.get(字符数组,字符个数n,终止字符)

或 cin.get(字符指针,字符个数n,终止字符)

3)带三个参数的get()函数 (续)

功能:从输入流中读取n-1字符,赋给字符数组或字符指针所指向的数组。如果在读取n-1个字符之前遇到终止字符,则提前结束。如果成功则返回非0,失败则返回0。

例:输入包含空格的字符串

char str[80];

cout<<"请输入一个字符串:";

cin.get(str,80,'\n');

cout<<str<<endl;

2) getline( )函数

其功能、用法与带三个参数的get( )一样,只是它的函数名更容易理解、记忆。

格式:cin.getline(字符数组或字符指针,字符个数n[,终止字符])

功能:与带三个参数的get()功能类似,从输入流中读取n-1字符,赋给字符数组或字符指针所指向的空间。如果在读取n-1个字符之前遇到终止字符(如果不写,默认为 ‘\n’),则提前结束。

(3) 几个与流操作有关的判断函数

eof()函数:是”end of file”的缩写,表示“文件结束”。到达文件末尾(即遇到文件结束符)时为“真”,否则为“假”。这个函数经常用到。

fail()函数:操作失败时返回“真”,操作成功时返回“假”。

!运算符经过了重载,它的功能与fail()函数相同,即: !cin 与 cin.fail() 等价

!cout 与 cout.fail() 等价
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: