收藏 分享(赏)

C++输入输出流.ppt

上传人:scg750829 文档编号:9119267 上传时间:2019-07-24 格式:PPT 页数:48 大小:445KB
下载 相关 举报
C++输入输出流.ppt_第1页
第1页 / 共48页
C++输入输出流.ppt_第2页
第2页 / 共48页
C++输入输出流.ppt_第3页
第3页 / 共48页
C++输入输出流.ppt_第4页
第4页 / 共48页
C++输入输出流.ppt_第5页
第5页 / 共48页
点击查看更多>>
资源描述

1、1,第10章 输入输出流,2,本章学习要求:,流的概念 C+中I/O处理类层次结构 基于控制台、文件以及字符串的I/O处理,3,10.1 流,4,10.1.1 流的概念,计算机中的数据从一个设备到另一个设备的传输,我们就称为数据流(可以想象数据是从一个设备流向另一个设备)。输入/输出的任务实际上就是以一种稳定、可靠的方式在任何设备与内存之间传输数据流。从内存输出到设备的数据流称为输出流(Output stream);从设备输入到内存的数据流称为输入流(Input stream)。,5,10.1.2 I/O流的层次结构,程序尽量不要直接和千变万化的外部存储设备打交道。按照如此想法设计的输入 /输

2、出的逻辑结构如图10-1所示。,输入输出的逻辑结构,传输管道内传输的是字节流,因为任何数据都是以字节为单位保存的。传输管道的左边负责将字节流转换成各种类型的值保存到内存变量,或将内存变量值转换成字节流。传输管道的右边负责将字节流交给外部设备,或将外部设备存储的数据转换成字节流放到管道中。外部设备不关心传递过来的数据是什么类型,只是按照自己的方式将一个个字节保存起来。传输管道的右边负责和具体的外部设备交互,它也不需要知道设备是如何存储数据,只要知道如何将字节流交给外部设备即可。,6,若将传输管道看作实现I/O功能的流对象,则一个流对象结构上可以分为两层:格式化层和传递层,如图10-2所示。,格式

3、化层:进行格式化或解析,例如将数据由内存表示转换成指定格式的字节表示,或将字节表示转换成内存中变量格式。 传递层:负责缓冲、编码转换和将字符序列传递到外部设备或从外部设备读入字符流。 格式化层的主要任务是在输入时负责解析从外部设备读入的字节流,而在输出时负责格式化和产生能输出到外部设备字节流。,7,10.2 C+I/O类库概览,8,10.2.1 C+I/O类库层次结构,C+流类层次结构中,除了ios_base类外,其他的流类几乎都是模板类。 C+中流类层次结构如图所示。,9,10.2.2 I/O基本类的成员及功能,1. ios_base ios_base类是非模板类,该类定义了一些输入/输出流

4、类中都具有的函数,以及输出/输出过程中使用的状态标志。 2. ios ios类定义了一些基础的输入/输出功能 . 3. istream istream类定义用来实现输入的基本功能,所有其他实现从具体外部设备输入的流类都必须从其继承。 4. ostream ostream类定义用来实现输出的基本功能,所有其他实现向具体外部设备输出的流类都必须从其继承。 5. 操纵符 操纵符(manipulator)也称为控制器函数,是为了简化对I/O流的格式设置和简化流的常用操作而定义的一些inline函数,通过调用这些函数可以设置对应流的输出格式。要在程序中使用操纵符,必须采用#include 指令来包含io

5、manip头文件。,10,10.3 基于I/O类库的控制台I/O,C+ I/O类库中预定义了四个控制台I/O对象cin、cout、cerror和clog,含义如表所示。,利用这些对象可以直接进行控制台的输入/输出。其中cin对应着计算机系统的标准输入设备,通常为键盘;cerr以及clog对应着计算机系统的用于输出信息的设备,通常情况下为显示器。 基于控制台的I/O,需要包含下列指令: #include ,11,10.3.1 控制台输出,1. 基本数据类型的输出 ostream类重载了操作符提供对基本数据类型数据输出的支持。,例 向控制台输出基本数据类型变量的值。 #include using

6、namespace std; int main() char ch = a;short s = 100;int i = 200;long l = 1000;unsigned short us = 234;float f = 3.23;double df = 1.55;char str = “C+ IO is very easy!“;cout ch endl;cout s endl;cout i endl;cout l endl;cout us endl;cout f endl;cout df endl;cout ,12,2. 格式化输出 数据通常需要按照某种预定义的报表格式进行输出。下面介绍C

7、+I/O中常见的格式控制。C+中的格式化输出通过设置某些标志进行控制,C+已经定义一些操纵符来简化某些格式标记的设置,下面的演示程序以操纵符的使用为主。,(1) 整数输出 通过操纵符hex、oct、dec来实现输出的基数的控制。,例 采用十进制、十六进制、八进制分别显示一个整数。 #include #include using namespace std; int main( ) int x = 100;cout x endl; /默认采用十进制输出cout hex x endl; /采用十六进制输出cout showbase oct x endl;/采用八进制输出,并输出前缀0cout de

8、c x endl; /采用十进制输出return 1; ,13,(2) 浮点数输出 浮点数字的输出可以采用定点格式和科学计数法两种,采用操纵符fixed、scientific来控制,同时可以通过setprecision来设置浮点数的精度。,例 分别以定点数和科学计数法输出浮点数。 #include #include using namespace std; int main( )double f = 94.873;cout fixed f “ “; /以定点格式输出,带小数点 cout scientific f endl;/科学计数法 /setprecision(2)设置小数点后有2位有效数c

9、out setprecision(2) fixed f “ “ scientific f endl; ,14,(3) 布尔类型输出 布尔类型的数据输出可以采用两种方式:字符串(输出true或false)、数字(输出表示真的1或表示假的0)。分别采用boolalpha和noboolalpha操纵符来选择这两种方式。,例 分别采用字符和数字方式输出布尔值。 #include #include using namespace std; int main( ) bool b1 = true, b2= false;cout b1 “ “ b2 endl;cout boolalpha b1 “ “ b2

10、endl; cout noboolalpha b1 “ “ b2 endl;,15,(4) 控制输出宽度 有时在发票上,了使打印机输出的内容和发票的样式能够对应上,需要使输出项的输出宽度不小于某个宽度,若输出项自身的宽度大于指定的宽度,则使用输出项自身的宽度。输出宽度的设置可以通过操作符setw。,例 将学生姓名和成绩按照上下对齐方式打印。 #include #include using namespace std; int main()double values = 89.5, 78, 92.5, 84;char *names = “Zoot“, “Jimmy“, “Allen“, “Sta

11、n“;for (int i=0;i4;i+)cout setw(10) namesi setw(10) valuesi endl; ,16,(5) 对齐 上例中输出项默认都是靠左边对齐的,可以通过left、right等控制输出项的对齐方式,如10.5中的输出语句改为: cout left setw(10) namesi setw(6) valuesi endl;,17,(6) 填充字符 可以使用fill操纵符来指定在指定宽度的输出中,采用的填充字符,默认的为空格.,例 将姓名和成绩按照固定宽度对齐输出,并利用*填充空白部分。 #include #include using namespace

12、std; int main()double values = 89.5, 78, 92.5, 84;char *names = “Zoot“, “Jimmy“, “Allen“, “Stan“;cout.fill(*);for (int i=0;i4;i+) cout setw(10) namesi setw(10) valuesi endl; ,18,3. 其他输出函数 C+中,除了使用操作符实现输出功能以外,也可以使用输出流对象的put、write函数实现数据的输出。函数原型见表10-5。这些成员函数既可用于ASCII文本流,也可用于二进制流,尤其适用于二进制流输出。,例 使用put函数输

13、出数据。 #include using namespace std; int main()couta,bn;cout.put(a); cout.put(,); cout.put(b); cout.put(n);char c1=A,c2=B;cout.put(c1); cout.put(,); cout.put(c2); ,19,例 使用write函数输出数据。 #include using namespace std; void PrintString(char *s) cout.write(s,strlen(s).put(n); /write返回的是一个输出流对象cout.write(s,6

14、)“n“; int main()char str=“I love you?“;cout“The string is: “strendl;PrintString(str);PrintString(“this is a string“); ,20,10.3.2 控制台输入,C+中通常使用提取操作符()来实现数据的输入。使用运算符输入数据时,系统跳过开头空白符(包括:空格( )、制表符(t)、换行符(n)、流结束符),然后提取待输入数据类型中所具有的符号。 1. 整数输入 使用输入整数时,系统跳过开头的空白字符然后读取一个数字,直到遇到非数字字符。整数的输入可以采用十进制、八进制、十六进制三种格式。

15、,例 采用十进展制、十六进制、八进制输入整数。 #include #include using namespace std; int main( )int x, y, z;cin x; /默认输入流中的整型数据为10进制格式cin hex; /设置输入流中的整型数据为16进制格式 cin y; cin oct z; /采用8进制输入整数值cout x y z; /默认采用十进制输出数值 ,21,2. 浮点数输入 浮点数的输入可以采用定点数和科学计数法两种格式。,例 输入浮点数。 #include #include using namespace std; int main()double d,

16、 d1, d2;float f, f1, f2;cin d f; /默认输入的数字是浮点数格式cin scientific; /指定输入的数字是科学计数法格式 cin d1 f1; cin fixed d2 f2; /指定输入的数字是浮点数格式 /默认采用定点数格式输出cout d d1 d2 endl;cout f f1 f2; ,22,3. 布尔类型的输入 布尔类型的输入可以采用两种格式:字符方式(true和false)、数字方式(1和0)。,例 输入布尔类型值。 #include #include using namespace std; int main()bool b1, b2, b

17、3, b4;cin boolalpha; /设置输入的布尔值是true或false格式的 cin b1 b2; cin noboolalpha b3 b4; /设置输入的布尔值是1或0格式的 /默认采用数字方式输出布尔值cout b1 b2 b3 b4; cout boolalpha; /采用true或false格式输出布尔值cout b1 b2 b3 b4 endl; ,23,4. 字符串的输入 字符串输入与其他类型数据的输入有些不同,因为字符串没有特别的格式说明。 当利用抽取符从输入流抽取字符串时,有两种终止方式: 遇到空白字符。 如果使用setw时,只能抽取固定数目的字符。,例 输入字符

18、串。 #include #include #include using namespace std; int main()string str;cout str;cout “接收的字符串为: “ str; ,24,对于string型字符串的输入,不需要考虑存储空间的大小,因为string型字符串对象能动态申请存储空间并在必要时调整其大小空间。C风格字符串是一个字符数组,大小固定,没有动态扩充能力。如果从输入流中抽取的字符数多于字符数组的容量,则写入会超过数组界限。为防止发生这种情况,每次抽取C串时都必须设置通过setw设置抽取的最大字符宽度。例如,C格式字符串的输入为: char bufsz;

19、 cin setw(sz) buf; 系统最多抽取sz-1个字符,最后一个存储空间存放串结束0。,25,5. 其他输入函数 除了提取符外,也可以利用istream类的其他成员函数如,get、getline、read来实现数据的输入. (1) get用来获取一个字符,例 从键盘输入一串字符,判断其中字符c的个数,并输出。 #include using namespace std; int main()char ch; int count = 0; char c = c;cout“输入: “;while(ch=cin.get()!=EOF)if (ch=c) count+;cout “输入的字符串

20、中字符“ c “出现了:“ count “次“; ,26,(2) getline函数用来获取一行 getline函数原型为: istream,例 利用getline从键盘输入字符串。 #include using namespace std; int main()char ch; int count = 0;char c = c;cout“输入: “;char s20;char b10;cin.getline(s, 20, #); /最多读入19个字节或遇到#或遇到n,读取结束cin.getline(b, 10); /最多读入9个字节或遇到n,读取结束cout “输出:“ endl;cout

21、s endl;cout b endl; ,27,(3) read函数用来获取指定数量的字符 read函数的原型为: istream 用来读取指定数量的字符,此时,空格、回车、0等都是可读入的字符。,28,10.3.3 用户自定义类型的I/O,若要让自定义类提供支持和(istream 他们都返回对流对象的引用。,29,例 定义一个PhoneNumber类,用来描述电话号码,重载和 using namespace std; class PhoneNumberfriend ostream ,int main()PhoneNumber pn;cin pn;cout endl;cout pn;retur

22、n 0; ,30,10.4 基于I/O类库的文件I/O,31,10.4.1 文件的概念,在C+中,把文件看成是由一系列字节所构成的字节流,称为流式文件。根据文件中数据的组织形式,可分为文本形式文件和二进制形式文件。这两种文件格式的重要区别为: 文本文件中通常包含的是可显的字符以及有限的几个控制字符(如:t、n、r等),而二进制文件中可以包含任意的二进制字节。文本方式一般用于存储具有“行”结构的数据,如源程序以及纯文本格式的数据等; 二进制文件一般用于存储无显式结构的数据,如目标代码程序以及二进制数据等。,32,每个流对象内部都有一个指针称为文件位置指针,它指出该流对象所关联的文件的当前读写的位

23、置,如图10-5所示。,如果我们把一个文件看作一个未知长度的字节数组的话,则该位置指针就象是数组的下标。进行输入/输出操作时,每输入/输出一个字节,文件位置指针都会自动往后移动一个字节位置。即文件位置指针总是指向下个将要被读的字节位置/下一个将要被写的字节位置。 在利用I/O类库进行文件输入/输出时,需要包含下面指令: #include #include ,33,10.4.2 文件输出,文件输出是指将内容输出到文件中,基本流程为: (1) 打开文件:创建ofstream流类的对象,建立流对象与文件的关联; (2) 输出数据:利用ofstream的以及其他的输出函数将数据写入到文件; (3) 关

24、闭文件:利用ofstream成员函数close关闭流对象。,1打开文件 打开文件有两种方法:直接方法和间接方法。 直接方法是在创建流对象时指定关联的文件名和打开方式,如: ofstream out_file(“f1.txt“, ios:out); 间接方法是创建ofstream类对象后,调用ofstream的成员函数open来指定关联的外部文件以及打开方式,建立流和文件的关联。如: ofstream out_file;out_file.open(“f1.txt“, ios:binary); ios:binary表示打开该文件,并将以二进制流的形式进行输出。,34,打开过程中,指定的ios:ou

25、t或ios:binary都是设置了文件打开的方式,他们是定义在ios类中的枚举常量,有多中选择,如表所示。,35,2输出数据 文件成功打开后,可以使用插入运算符()或ofstream类的一些成员函数来进行文件输出操作。其实,文件的输出和控制台的输出没有太多的区别。,例 从键盘输入数据,并输出到文件。 #include #include using namespace std; int main()ofstream out_file(“c:myfile.txt“);if (!out_file)return;int x = 100; double y = 3.14;out_file x , y e

26、ndl;out_file “WWW.HHU.EDU.CN“ endl;out_file.put(#); out_file.put(n);out_file.write(“CIES.HHU.EDU.CN“,15);out_file.close(); ,36,3关闭文件 文件输出操作结束时,要使用ofstream的一个成员函数close关闭文件,如:out_file.close( );该操作将缓冲区中的数据全部送到文件中,然后切断out_file流对象和文件的关联关系,并释放打开文件时系统分配的资源。以后就不能再利用out_file来进行输出操作,除非再次使用out_file.open来将其和指定的

27、文件关联。,37,10.4.3 文件输入,文件输入是指将文件中数据读取到内存文件中,基本流程为: (1) 打开文件:创建ifstream流类的对象,建立流对象与指定文件的关联; (2) 从文件读入:利用ifstream的以及其他的输入函数读文件中数据; (3) 关闭文件:利用ifstream的成员函数close关闭流对象,取消流对象和文件的关联。,38,1打开文件 创建ifstream类的对象,并与外部文件关联。建立ifstream对象与外部文件关联有两种方法:直接法和间接法。如: ifstream in_file(“f1.txt“, ios:in);/直接法,以文本形式打开文件f1.txt进

28、行读或 ifstream in_file; in_file.open(“f1.txt“, ios:in); /间接法,以文本形式打开文件f1.txt进行读ios:in用来控制文件打开的方式。在进行输入操作前也要判断文件是否正确打开。代码如下: if (!in_file) /或 in_file.faile() 或 !in_file.is_open() /处理打开失败 ,39,2从文件读数据 文件成功打开后,可以使用抽取操作符()或ifstream类的一些成员函数进行输入操作,方法和基于控制台的输入基本相同。,40,例 读入上例输出的数据,并显示。 #include #include #inclu

29、de using namespace std; int main()ifstream in_file(“c:myfile.txt“);if (!in_file)return 1;int x; double y;string s;in_file x;in_file.ignore(); /忽略逗号,in_file y;in_file s; /将WWW.HHU.EDU.CN输入到s中char ln = in_file.get(); /读到的是WWW.HHU.EDU.CN后的回车符char c = in_file.get(); /读到的是#in_file.ignore(); /忽略#后面的回车符,它是

30、一个字节char array18;in_file.getline(array, 16); /读取一行cout x , y endl;cout s;cout ln; cout c endl;cout array;in_file.close(); ,41,3. 关闭文件 读入操作结束后,应使用close关闭文件: in_file.close();,42,10.4.4 文件随机存取,以上介绍的ostream和ifstream只能进行输出或输入操作,如果需要打开一个既能输入也能输出数据的文件,则需要创建一个fstream类的对象,下面打开的文件既能读出又能写入数据: fstream io_file(“

31、c:test.txt“, ios:in|ios:out);/打开文件或 fstream io_file; io_file.open(“c:test.txt“, ios:in|ios:out); ios:in和ios:out用来控制文件打开的方式,具体的打开方式控制参数见表10-7的说明部分。 以读写方式打开的文件,在流对象内部设置了两个文件位置指针,一个用于指定读的位置,一个用于指定写的位置,这两个位置指针是不同的。,43,一般情况下读写是顺序进行的,即逐个字节进行,但是对于二进制数据文件来说,可以利用流中的成员函数移动文件位置指针,随机访问文件中任意位置上的数据,还可以修改文件内容。文件流所

32、提供的和文件指针操作有关的成员函数如表所示 .,44,10.5 基于I/O类库的字符串I/O,。C+提供了istringstream(输入)、ostringstream(输出)和stringstream(输入输出)来支持字符串输入输出,要使用字符串I/O功能,需要在程序中包含指令: #include #include 基于I/O类库的字符串输入输出,和文件输入输出的方法基本相同,只是流对象所关联的设备不是外部文件,而是内存中的一块缓冲区(存储单元)。 同时要注意,字符串输入输出流对象没有open和close函数,即不需要通过open和close来打开设备和关闭设备。,45,1输出字符串流对象

33、ostringstream类提供的构造函数的原型为: ostringstream:ostringstream(int mode=ios:out);创建输出字符串流对象: ostringstream strout; 该流对象所关联的缓冲区有strout内部动态申请。下面的语句向流对象输出: int a, b; cin a b; strout x y ends; /ends操纵符的作用是向流中输入一个0,46,2字符串输入流 istringstream类提供的构造函数原型为: istringstream:istringstream(const string str, int mode=ios:in

34、);str是一个字符串缓冲区,它用来初始化流对象,流对象将和它的字符串缓冲区建立关联,默认的打开方式为ios:in。可以用以下语句建立输入字符串流对象: string str; str = “100, 200“; istringstream iss(str); int x,y; char c; iss x c y; / x=100, c=, y=200,47,3. 字符串输入输出流 stringstream类创建的流对象既可进行字符串输出也可进行字符串输入,它提供了两个构造函数,原型为: stringstream:stringstream(int mode=ios:in|ios:out); stringstream:stringstream(string str, int mode=ios:in|ios:out);默认的打开方式都为ios:in|ios:out,也可以单独指定ios:in或ios:out。第一种方式的构造函数中,缓冲区由流对象自己动态申请,第二种方式的构造函数中,则程序员提供一个str作为缓冲区。,48,例 字符串输入输出流。 #include #include #include using namespace std; int main()int x;stringstream ss;/建立输入输出流ss x;cout x; cout “x1=“ x; ,

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报