第七章输入输出流.docx

上传人:b****8 文档编号:9335596 上传时间:2023-02-04 格式:DOCX 页数:35 大小:321.53KB
下载 相关 举报
第七章输入输出流.docx_第1页
第1页 / 共35页
第七章输入输出流.docx_第2页
第2页 / 共35页
第七章输入输出流.docx_第3页
第3页 / 共35页
第七章输入输出流.docx_第4页
第4页 / 共35页
第七章输入输出流.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

第七章输入输出流.docx

《第七章输入输出流.docx》由会员分享,可在线阅读,更多相关《第七章输入输出流.docx(35页珍藏版)》请在冰豆网上搜索。

第七章输入输出流.docx

第七章输入输出流

第7章输入输出流

7.1C++的输入和输出

7.1.1输入输出的含义

编译系统已经以运算符或函数的形式做好了对标准外设(键盘、屏幕、打印机、文件)的接口,使用时只需按照要求的格式调用即可。

cin>>x;cout<

cin.get(ch);

 

7.1.2C++的I/O对C的发展——类型安全和可扩展性

在C语言中,用printf和scanf进行输入输出,往往不能保证所输入输出

的数据是可靠的、安全的。

在C++的输入输出中,编译系统对数据类型进行严格

的检查,凡是类型不正确的数据都不可能通过编译。

因此C++的I/O操作是

类型安全的。

此外,用printf和scanf可以输出和输入标准类型的数据,但无法输出

用户自己声明的类型(如数组、结构体、类)的数据。

C++的I/O操作是可扩展

的,不仅可以用来输入输出标准类型的数据,也可以用于用户自定义类型的数据。

7.1.3C++的输入输出流(I/OStream)

1.iostream类库中有关的类

图7.1

图7.2

图7.3

C++语言的I/O系统向用户提供一个统一的接口,使得程序的设计尽量与所访问的具体设备无关,在用户与设备之间提供了一个抽象的界面:

输入输出流。

用标准流进行输入/输出时,系统自动地完成数据类型的转换。

对于输入流,要将输入的字符序列形式的数据变换成计算机内部形式的数据(二进制或ASCII)后,再赋给变量,变换后的格式由变量的类型确定。

对于输出流,将要输出的数据变换成字符串形式后,送到输出流(文件)中。

2.与iostream类库有关的头文件

iostream类库中不同的类的声明被放在不同的头文件中,头文件是程序

与类库的接口。

常用的头文件有:

iostream包含了对输入输出流进行操作所需的基本信息

fstream用于用户管理的文件的I/O操作

strstream用于字符串流I/O

stdiostream用于混合使用C和C++的I/O机制是时

iomanip在使用格式化I/O时应包含此头文件

3.在iostream头文件中定义的流对象

4.在iostream头文件中重载运算符

重载输出(插入)运算符的一般格式为:

友元函数

friendistream&operater<<(istream&,ClassName&);

返回值类型函数名左操作数右操作数

 

返回值类型:

类istream的引用,cout中可以连续使用运算符“<<”。

cout<

第一个参数:

是“<<”的左操作数cout类型,类istream的引用

第二个参数:

是“<<”的右操作数,即欲输入的对象的引用.

 

例1.

#include

classincount

{intc1,c2;

public:

incount(inta=0,intb=0){c1=a;c2=b;}

friendostream&operator<<(ostream&,incount&);//重载输出函数原型说明

};

ostream&operator<<(ostream&os,incount&cc)//重载输出函数定义

{os<<"c1="<

voidmain(void)

{

incountx1,x2(33,88);

cout<

}

7.2标准输出流

7.2.1cout,cerr和clog流

1.cout流对象

cout是consoleoutput的缩写,意为在控制台(终端显示器)的输出。

cout

不是C++预定义的关键字,它是ostream流类的对象。

在iostream中定义。

2.cerr流对象

cerr流对象是标准出错流,cerr的作用是向标准出错设备(standanderror

device)输出有关出错信息。

cerr是consoleerror的缩写。

cout流通常是传送到显示器输出,但也可以被重定向输出到磁盘文件,而cerr

流中的信息只能在显示器输出。

当调试程序时,往往不希望程序运行时的出错信息

被送到其他文件,而要求在显示器上及时输出,这时应该用cerr。

cerr流中的信息

是用户根据需要指定的。

例2.一元二次方程求解程序

#include

#include

usingnamespacestd;

intmain()

{floata,b,c,disc;

cout<<"pleaseinputa,b,c:

";

cin>>a>>b>>c;

if(a==0)

cerr<<"aisequaltozero,error!

"<

else

if((disc=b*b-4*a*c)<0)

cerr<<"disc=b*b-4*a*c<0"<

else

{cout<<"x1="<<(-b+sqrt(disc))/(2*a)<

cout<<"x2="<<(-b-sqrt(disc))/(2*a)<

}

return0;

}

 

3.clog流对象

clog流对象也是标准出错流,它是consolelog的缩写。

它的作用和cerr相同,

都是在终端显示器上显示出错信息。

它们之间只有一个微小的差别:

cerr是不经过

缓冲区,直接向显示器上输出有关信息,而clog中的信息存放在缓冲区中,缓冲区

满后或遇endl时向显示器输出。

 

 

7.2.2格式输出

1.使用控制符控制输出格式

这些控制符是在头文件iomanip中定义的,因而程序中应当包含头文件iomanip。

例3.控制符控制输出格式

#include

#include

usingnamespacestd;

intmain()

{inta;

cout<<"inputa:

";

cin>>a;

cout<<"dec:

"<

cout<<"hex:

"<

cout<<"oct:

"<

char*pt="China";

cout<

cout<

doublepi=22.0/7.0;

cout<

:

scientific)<

cout<<"pi="<

cout<<"pi="<

cout<<"pi="<

:

fixed)<

return0;

}

2.用流对象的成员函数控制输出格式

流成员函数setf和控制符setiosflags括号中的参数表示格式状态,它是通过

格式标志来指定的。

格式标志在类ios中被定义为枚举值。

因此在引用这些格式标志

时要在前面加上类名ios和域运算符“:

:

”。

格式标志见下表:

例4.用流控制成员函数输出数据

#include

usingnamespacestd;

intmain()

{inta=21;

cout.setf(ios:

:

showbase);//设置输出时的基数符号

cout<<"dec:

"<

cout.unsetf(ios:

:

dec);//终止十进制的格式设置

cout.setf(ios:

:

hex);//设置以十六进制输出的状态

cout<<"hex:

"<

cout.unsetf(ios:

:

hex);//终止十六进制的格式设置

cout.setf(ios:

:

oct);//设置以八进制输出的状态

cout<<"oct:

"<

cout.unsetf(ios:

:

oct);//终止八进制的格式设置

char*pt="China";

cout.width(10);//指定域宽为10

cout<

cout.width(10);

cout.fill('*');//指定空白处以“*”填充

cout<

doublepi=22.0/7.0;

cout.setf(ios:

:

scientific);//指定用科学记数法输出

cout<<"pi=";

cout.width(14);

cout<

cout.unsetf(ios:

:

scientific);//终止科学记数法状态

cout.setf(ios:

:

fixed);//指定用定点形式输出

cout.width(12);

cout.setf(ios:

:

showpos);//在输出正数时显示“+”号

cout.setf(ios:

:

internal);//数符出现在左侧

cout.precision(6);//保留6位小数

cout<

return0;

}

7.2.3用流成员函数put输出字符

例如:

cout.put(‘a’)或cout.put(65+32)

或cout.put(71).put(79).put(79).put(68).put(‘\n’);将显示GOOD

例5.将字符串“BASIC”按相反的顺序输出

#include

usingnamespacestd;

intmain()

{char*a="BASIC";

for(inti=4;i>=0;i--)

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

cout.put('\n');

return0;

}

输出结果:

CISAB

7.3标准输入流

标准输入流是从标准输入设备(键盘)流向程序的数据。

7.3.1cin流

当遇到无效字符或遇到文件结束符(Ctrl+D或Ctrl+Z)时,输入流cin就处于

出错状态,即无法正常提取数据,此时对cin流的所有提取操作都将终止。

当cin流处于出错状态,如果测试cin的值,可以发现它的值为false(假),即

cin为0值。

如果输入流在正常状态,cin的值为true(真),即cin为一个非0值。

例6.通过测试cin的真值,判断流对象是否处于正常状态

#include

usingnamespacestd;

intmain()

{floatgrade;

cout<<"entergrade:

";

while(cin>>grade)

{if(grade>=85)cout<

"<

if(grade<60)cout<

"<

cout<<"entergrade:

";

}

cout<<"Theend."<

return0;

}

7.3.2用于字符输入的流成员函数

1.用get函数读入一个字符

流成员函数get有3种形式:

无参数的,有一个参数的,有3个参数的。

(1)不带参数的get函数

例7.用get函数读入字符

#include

usingnamespacestd;

intmain()

{charc;

cout<<"enterasentence:

"<

while((c=cin.get())!

=EOF)

cout.put(c);

return0;

}

(2)有一个参数的get函数

例8.用get函数读入字符

#include

usingnamespacestd;

intmain()

{charc;

cout<<"enterasentence:

"<

while(cin.get(c))//读取一个字符赋给字符变量c

{cout.put(c);

}

cout<<"end"<

return0;

}

(3)有3个参数的get函数

其调用形式为:

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

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

其作用是从输入流中读取n-1个字符,赋给指定的字符数组(或字符指针指向的数组),

如果在读取n-1个字符之前遇到指定的终止字符,则提前结束读取。

如果读取成功则

函数返回非0值(真),如失败(遇文件结束符)则函数返回0值(假)。

例9.用get函数读入字符

#include

usingnamespacestd;

intmain()

{charch[20];

cout<<"enterasentence:

"<

cin.get(ch,10,'\n');

cout<

return0;

}

 

2.用成员函数getline函数读入一行字符

getline函数的作用是从输入流中读取一行字符,其用法与但3个参数的get

函数类似。

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

例10.用getline函数读入一行字符

#include

usingnamespacestd;

intmain()

{charch[20];

cout<<"enterasentence:

"<

cin>>ch;

cout<<"Thestringreadwithcinis:

"<

cin.getline(ch,20,'/');

cout<<"Thesecondpartis:

"<

cin.getline(ch,20);

cout<<"Thethirdpartis:

"<

return0;

}

 

7.3.3istream类的其他成员函数

1.eof函数

eof是endoffile的缩写,表示“文件结束”。

从输入流中读取数据,如果

到达文件末尾(遇文件结束符),eof函数值为非0值(真),否则为0值(假)。

例11.逐个读入一行字符,将其中的非空格字符输出

#include

usingnamespacestd;

intmain()

{charc;

while(!

cin.eof())

if((c=cin.get())!

='')

cout.put(c);

return0;

}

 

2.peek函数

peek是“观察”的意思,peek函数的作用是观测下一个字符。

其调用形式为

c=cin.peek()

cin.peek()函数的返回值是指针指向的当前字符,但它只是观测,指针人停留在

当前位置,并不后移。

如果要访问的字符是文件结束符,则函数值是EOF(-1)。

+

 

3.putback函数

其调用形式为cin.putback(ch);

其作用是将前面用get或getline函数从输入流中读取的字符ch返回到输入流,

插入到当前指针位置,以供后面读取。

例11.peek函数和putback函数的用法

#include

usingnamespacestd;

intmain()

{charc[20];

intch;

cout<<"pleaseenterasentence:

"<

cin.getline(c,15,'/');

cout<<"Thefirstpartis:

"<

ch=cin.peek();

cout<<"Thenextcharacter(ASCIIcode)is:

"<

cin.putback(c[0]);

cin.getline(c,15,'/');

cout<<"Thesecondpartis:

"<

return0;

}

运行结果

pleaseenterasentence:

Iamaboy./amastudent./

Thefirstpartis:

Thenextcharacter(ASCIIcode)is:

32(下一个字符是空格)

Thesecondpartis:

Iamastudent

图7.4

4.ignore函数

其调用形式为cin.ignore(h,终止字符);

其作用是跳过输入流中的n字符,或在遇到指定的终止字符时提前结束(此时跳过

包括终止字符在内的若干字符)。

ignore(5,’A’)//跳过输入流中5字符,遇’A’后就不再跳了

也可以不带参数或只带一个参数。

ignore()(n默认值为1,终止字符默认为EOF)

相当于ignore(1,EOF)

例12.用ignore函数跳过输入流中的字符

先看不用ignore函数的情况:

#include

usingnamespacestd;

intmain()

{charch[20];

cin.get(ch,20,'/');

cout<<"Thefirstpartis:

"<

cin.get(ch,20,'/');

cout<<"Thesecondpartis:

"<

return0;

}

运行结果

IlikeC++./IstudyC++./Iamhappy.

Thefirstpartis:

IlikeC++.

Thesecondpartis:

改为用ignore函数的情况:

#include

usingnamespacestd;

intmain()

{charch[20];

cin.get(ch,20,'/');

cout<<"Thefirstpartis:

"<

cin.ignore();//跳过输入流中1字符

cin.get(ch,20,'/');

cout<<"Thesecondpartis:

"<

return0;

}

运行结果

IlikeC++./IstudyC++./Iamhappy.

Thefirstpartis:

IlikeC++.

Thesecondpartis:

IstudyC++.

7.4文件操作与文件流

7.4.1文件的概念

文件流

C++在头文件fstream.h中定义了C++的文件流类体系,当程序中使用文件时,要包含头文件fstream.h

ios

ifstream(输入流)

ofstream(输出流)

fstream

在“fstream.h”中说明

当使用文件时,在程序头有:

#include

其中定义了各种文件操作运算符及函数。

 

文件的操作

 

文本文件:

以ASCII表示的文件:

记事本,*.cpp等

 

文件

二进制文件:

用二进制形式表示的文件:

可执行程序*.EXE等

56:

ASCII表示为0011010100110110,占两字节

56:

二进制表示为111000,占六个二进制位

 

不同的文件操作的函数、格式不同

 

7.4.2文件流类与文件流对象

标准输入输出流类:

istream、ostream和iostream

用于文件操作的文件类:

1.ifstream类,它是从istream类派生的,用来支持从磁盘文件的输入。

2.ofstream类,它是从ostream类派生的,用来支持向磁盘文件的输出。

1.fstream类,它是从iostream类派生的,用来支持对磁盘文件的输入输出。

可以用下面的方法建立一个输出文件流对象:

ofstreamoutfile;

 

7.4.3文件的打开与关闭

1.打开磁盘文件

打开文件是指在文件读写之前做必要的准备工作,包括:

1.为文件流对象和指定的磁盘文件建立关联,以便使文件流流向指定的磁盘文件。

2.指定文件的工作方式,如,该文件是作为输入文件还是输出文件,是ASCII

文件还是二进制文件等。

以上工作可以通过两种不同的方法实现。

1.调用文件流的成员函数open。

ofstreamoutfile;//定义ofstream类(输出文件流类)对象outfile

outfile.open(“f1.dat”,ios:

:

out);//使文件流与f1.dat(指定它为输出文件)文件建立关联

调用成员函数open的一般形式为

文件流流对象.open(磁盘文件名,输入输出方式);

2.在定义文件流对象时指定参数

如ofstreamoutfile(“f1.dat”,ios:

:

out);

输入输出方式是在ios类中定义的,它们是枚举常量,有多种选择。

见下表。

2.关闭磁盘文件

在对已打开的磁盘文件的读写操作完成后,应关闭该文件。

用成员函数close。

如outfile.close();//将输出文件流所关联的磁盘文件关闭

 

7.4.4对ASCII文件的操作

对ASCII文件的读写操作可以用以下两种方法:

1.用流插入运算符“<<”和流提取运算符“>>”输入输出标准类型的数据。

2.用put、get、getline等成员函数进行字符的输入输出。

例13.有一个整型数组,含10个元素,从键盘输入10个整数给数组,

将此数组送到磁盘文件中存放。

#include

#include

usingnamespacestd;

intmain()

{inta[10];

ofstreamoutfile("f1.dat");//定义文件流对象,打开磁盘文件“f1.dat”

if(!

outfile)//如果打开失败,outfile返回0值

{cerr<<"open

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 法语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1