Presentation is loading. Please wait.

Presentation is loading. Please wait.

面向对象程序设计 QQ群:343072849 Object-Oriented Programming 汽车学院.

Similar presentations


Presentation on theme: "面向对象程序设计 QQ群:343072849 Object-Oriented Programming 汽车学院."— Presentation transcript:

1 面向对象程序设计 QQ群: Object-Oriented Programming 汽车学院

2 内存 显示器 键盘 文件 文件 打印机... 光笔.... 输出流 输入流
编译系统已经以运算符或函数的形式做好了对标准外设(键盘、显示器、打印机、文件)的接口,使用时只需按照要求的格式调用即可。 cin>>x; cout<<x; cin.get(ch);

3 第7章 C++流类库与输入输出 7.1 C++为何建立自己的输入输出系统 7.2 C++流的概述 7.3 预定义类型的输入输出
7.4 用户自定义类型的输入输出 7.5 文件的输入输出 7.6 命名空间和头文件命名规则 7.7 应用举例

4 (1)因为C++的输入输出系统比C语言更安全、更可靠。 例如:在C语言中, 常常会出现下面的错误:
int i; //假定int型占两个字节, float f //假定float型占四个字节 scanf("%d",&i); //正确,输入一个整数,赋给整型变量i scanf("%d",i); //错误,漏写& printf("%d",i); //正确,输出整型变量i的值 printf("%d",f); //错误,输出f变量中前两个字节的内容 C的类型检查机制相对较弱,认为语句是合法的。 C++的编译系统加强了对数据类型的检查,凡是类型不正确的数据都不可能通过编译,认为这两条语句是错误的。因此,用C++的输入输出系统进行操作是类型安全的。

5 在C++中需要定义众多的用户自定义类型(如结构体、类等),但是使用C语言中的printf和scanf是无法对这些数据进行输入输出操作的。
(2) C++的I/O操作是可扩展的 在C++中需要定义众多的用户自定义类型(如结构体、类等),但是使用C语言中的printf和scanf是无法对这些数据进行输入输出操作的。 例子: class My_class{ public: int i; float f; char *str; }; . . . my_class obj; printf("% my_class",obj); C++的类机制允许它建立一个可扩展的输入输出系统,不仅可以用来输入输出标准类型的数据,也可以用于用户自定义类型的数据。 在C语言中,无法对My_class类对象的值进行输入输出操作

6 第7章 C++流类库与输入输出 7.1 C++为何建立自己的输入输出系统 7.2 C++流的概述 7.3 预定义类型的输入输出
7.4 用户自定义类型的输入输出 7.5 文件的输入输出 7.6 命名空间和头文件命名规则 7.7 应用举例

7 7.2 C++流的概述 7.2.1 C++的输入输出流 7.2.2 预定义的流对象 7.2.3 输入输出流的成员函数

8 输入输出是数据传送的过程,数据如流水一样从一处流向另一处。C++形象地将此过程称为流(stream)。
从流中提取数据称为输入操作,在输入操作中,字节流从输入设备(例如键盘、磁盘、网络连接等)流向内存; 向流中添加数据称为输出操作,在输出操作中,字节流从内存流向输出设备(例如显示器、打印机、网络连接等)。 C++编译系统带有一个I/O流类库。在I/O流类库中包含许多用于输入输出的类,称为流类。用流类定义的对象称为流对象。

9 C++的输入输出流 1. 用于输入输出的头文件 iostream类库中不同的类的声明被放在不同的头文件中,用户在自己的程序中用#include命令包含了有关的头文件就相当于在本程序中声明了所需要用到的类。常用的头文件有: iostream //包含了对输入输出流进行操作所需的所有信息 fstream //用于用户管理文件的I/O操作 strstream //用于字符串流的I/O操作 stdiostream//用于混合使用C和C++的I/O机制时 iomanip//在使用格式化I/O时应包含此头文件

10 2. 用于输入输出的流类 ios I/O流类库中包含了许多用于输入输出操作的类,
ios是抽象基类,输入流类istream和输出流类ostream是通过单继承从基类ios派生而来的, 输入输出流类iostream是通过多继承从类istream和ostream派生而来的。 ios istream ostream iostream 图7.1 输入输出流类的继承层次结构

11 表 7.1 P288

12 C++的输入输出流 图7.2 ios类的派生层次

13 7.2 C++流的概述 7.2.1 C++的输入输出流 7.2.2 预定义的流对象 7.2.3 输入输出流的成员函数

14 7.2.2 预定义的流对象 用流类定义的对象称为流对象。 与输入设备(如键盘)相联系的流(流对象)称为输入流(流对象);
预定义的流对象 用流类定义的对象称为流对象。 与输入设备(如键盘)相联系的流(流对象)称为输入流(流对象); 与输出设备(如屏幕)相联系的流(流对象)称为输出流(流对象); 与输入输出设备(如磁盘)相联系的流(流对象)称为输入流出流(流对象)。

15 7.2.2 预定义的流对象 C++中包含几个预定义的流(流对象) ,它们是: .标准输入流 (流对象) cin
预定义的流对象 C++中包含几个预定义的流(流对象) ,它们是: .标准输入流 (流对象) cin .标准输出流(流对象) cout .非缓冲型的标准出错流 (流对象) cerr .缓冲型的标准出错流 (流对象) clog

16 7.2.2 预定义的流对象 (1) cin----标准输入流对象, 与标准输入设备相联系(通常指键盘)。
预定义的流对象 (1) cin----标准输入流对象, 与标准输入设备相联系(通常指键盘)。 例如: cin>>变量名; “>>”为提取运算符(输入运算符),表示从键盘读取数据放入变量中。 (2) cout---标准输出流(流对象), 与标准输出设备相联系(通常指显示器)。 例如: cout<<“数据”; “<<”为插入运算符(输出运算符),表示将“数据”写到显示器上。

17 (3)cerr---非缓冲型的标准出错流对象,与标准输出设备相联系(通常指显示器)。
(4) clog---缓冲型的标准出错流,与标准输出设备相联系(通常指显示器)。 cerr与clog均用来输出出错信息。 cerr和clog之间的区别是: cerr是不经过缓冲区,直接向显示器上输出有关信息,因而发送给它的任何内容都立即输出; clog中的信息存放在缓冲区中,缓冲区满后或遇上endl时向显示器输出。 只要在程序中包含头文件iostream.h,C++程序开始运行时这四个标准流对象的构造函数都被自动调用。

18 用户也可以用istream和ostream等类声明自己的流对象.
例如 istream is; ostream os; 声明了is为输入流对象,声明了os为输出流对象。

19 预定义的流对象 iostream头文件中的4种流对象

20 7.2 C++流的概述 7.2.1 C++的输入输出流 7.2.2 预定义的流对象 7.2.3 输入输出流的成员函数

21 7.2.3 输入输出流的成员函数 1、put函数 2、get函数 3、getline函数 4、ignore函数

22 7.2.3 输入输出的成员函数 1. put函数 put函数用于输出一个字符,格式: cout.put(char c); 例如:
输入输出的成员函数 1. put函数 put函数用于输出一个字符,格式: cout.put(char c); 例如: cout.put('A'); 与语句 cout<<'A'; 等价,所不同的是put函数的参数不仅可以是字符,还可以是字符的ASCII码(也可以是一个整型表达式)。 如cout.put(65); 或cout.put(20+45); #include<iostream> using namespace std; int main() { cout.put('A'); cout<<'A'; cout.put(20+45); cout.put('\n'); cout.put(65),cout.put(66),cout.put('\n');//可以在一个语句中连续调用put函数。 return 0; }

23 输入输出的成员函数 2. get函数 get函数的功能与提取运算符“>>”类似,主要的不同是get函数在读入数据时可包括空白字符,而提取运算符默认情况下拒绝接受空白字符。 常用的调用格式: cin.get(字符型变量); 功能: 是从输入流中读取一个字符(包括空白符),赋给字符变量,如果读取成功则函数返回非0值,如失败(遇文件结束符EOF)则函数返回0值。

24 #include<iostream> using namespace std; int main() { char ch;
//例7.1 get函数应用举例。 #include<iostream> using namespace std; int main() { char ch; cout<<"Input:"; while(cin.get(ch)) cout.put(ch); return 0;} 运行时,如果输入: 123 abc xyz 则输出: 当输入“Ctrl+z”及回车时,程序读入的值是EOF,程序结束。

25 7.2.3 输入输出的成员函数 3. getline函数 调用格式: cin.getline(字符数组,字符个数n,终止标志字符); 或
输入输出的成员函数 3. getline函数 调用格式: cin.getline(字符数组,字符个数n,终止标志字符); cin.getline(字符指针,字符个数n,终止标志字符); 功能: 从输入流读取n-1个字符,赋给指定的字符数组(或字符指针指向的数组),然后插入一个字符串结束标志‘\n’。 如果在读取n-1个字符之前遇到指定的终止字符,则提前结束读取,然后插入一个字符串结束标志'\n'。

26 本程序连续读入一串字符,最多读取19个字符赋给字符数组line,或遇到字符't'提前停止。
例7.2 用getline函数读入一行字符。 #include<iostream> using namespace std; int main() { char line[20]; cout<<"输入一行字符:"<<endl; cin.getline(line,20,'t');//读入19个字符或遇字符't'结束 cout<<line; return 0; } 本程序连续读入一串字符,最多读取19个字符赋给字符数组line,或遇到字符't'提前停止。

27 说明: 请注意用“cin>>”和成员函数“cin.getline()”读取数据的区别。 (1) 使用“cin>>”可以读取C++标准类型的各类数据(如果经过重载,还可以用于输入自定义类型的数据),而用“cin.getline()”只能用于输入字符型数据。 (2) 使用“cin>>”读取数据时以空白字符(包括空格、tab键、回车键)作为终止标态,而“cin.getline()” 可连续读取一系列字符,可以包括空格。

28 7.2.3 输入输出的成员函数 4. ignore函数 调用格式: cin.ignore(n,终止字符);
输入输出的成员函数 4. ignore函数 调用格式: cin.ignore(n,终止字符); 功能:是跳过输入流中n个字符(默认个数为1),或在遇到指定的终止字符(默认终止字符是EOF)时提前结束。 例如: cin.ignore(10,'t') 跳过输入流中10个字符,或遇字符't'后就不再跳了 说明: ignore函数可以不带参数或只带一个参数, cin.ignore() 相当于 cin.ignore(1,EOF ) 只跳过1个字符(n的默认值为1,默认终止字符是EOF)

29 7.2.3 输入输出的成员函数 4. ignore函数 调用格式: cin.ignore(n,终止字符);
输入输出的成员函数 4. ignore函数 调用格式: cin.ignore(n,终止字符); 从输入流(cin)中提取字符,提取的字符被忽略,不被使用。每抛弃一个字符,它都要计数和比较字符:如果计数值达到n或者被抛弃的字符是终止字符,则cin.ignore()函数执行终止;否则,它继续等待。 它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。比如可以这么用:cin.ignore(1024,'\n'),通常把第一个参数设置得足够大,这样实际上总是只有第二个参数'\n'起作用,所以这一句就是把回车(包括回车)之前的所以字符从输入缓冲(流)中清除出去。

30 7.2.3 输入输出的成员函数 如果没有cin.ignore(),可以一次输入3个数,用空格隔开就可以了。
输入输出的成员函数 #include <iostream> using namespace std; int main() { int a,b,c; cout<<"input a:"; cin>>a; cin.ignore(1024, '\n'); cout<<"input b:"; cin>>b; cout<<"input c:"; cin>>c; cout<<a<<"\t"<<b<<"\t"<<c<<endl; return 0; } 如果没有cin.ignore(),可以一次输入3个数,用空格隔开就可以了。

31 第7章 C++流类库与输入输出 7.1 C++为何建立自己的输入输出系统 7.2 C++流的概述 7.3 预定义类型的输入输出
7.4 用户自定义类型的输入输出 7.5 文件的输入输出 7.6 命名空间和头文件命名规则 7.7 应用举例

32 7.3 预定义类型的输入输出 预定义类型的输入输出是指C++系统预定义的标准类型(如int、float、double型等)数据的输入输出,它是其它输入输出的基础。

33 7.3 预定义类型的输入输出 7.3.1 插入运算符与提取运算符 7.3.2 输入输出的格式控制

34 7.3.1 插入运算符与提取运算符 基于C++I/O流类库的输入输出经常要使用流对象cin和cout,同时还要使用与之配套的两个运算符“>>”和“<<”,一般格式为: cin >> 变量; //输入 cout << 常量、变量或表达式; //输出

35 7.3.1 插入运算符与提取运算符 1. 插入运算符“<<”
在C++中“<<”本来是被定义为左位移运算符,由于在iostream头文件中对它进行了重载,使它能用作标准类型数据的输出运算符。插入运算符(也称输出运算符)“<<”是一个双目运算符,有两个操作数,左操作数为输出流类ostream的一个流对象(如cout),右操作数为一个系统预定义的标准类型的常量或变量。在头文件iostream中有一组运算符函数对运算符“<<”进行重载,能用它输出各种标准类型的数据,其原型有: ostream &operator << (ostream &类型名); 的形式。其中类型名指C++标准类型。(P292)

36 7.3.1 插入运算符与提取运算符 1. 插入运算符“<<” 说明:
使用插入运算符“<<”进行输出操作时,可以把多个不同类型的数据组合在一条语句中,使用起来很方便。

37 7.3.1 插入运算符与提取运算符 2. 提取运算符“>>”
在C++中“>>”本来是被定义为右位移运算符,由于在iostream头文件中对它进行了重载,使它能用作标准类型数据的输入运算符。提取运算符(也称输入运算符)“>>”也是一个双目运算符,有两个操作数,左操作数为输入流类istream的一个流对象(如cin),右操作数为一个系统预定义的任何标准数据类型的变量。在头文件iostream中也有一组运算符函数对运算符“>>”进行重载,能用它输入各种标准类型的数据,其原型有: istream &operator >> (istream& 类型名 &); 的形式。其中类型名指C++标准类型。(P293)

38 7.3.1 插入运算符与提取运算符 2. 提取运算符“>>” 说明:
(1)在默认情况下,运算符将跳过空白符,然后读入后面的与变量类型相对应的值。因此,给一组变量输入值时可用空格或换行符将键入的数据间隔开。 (2)当输入字符串(即类型为char *的变量)时,提取运算符“>>”的作用是跳过空白,读入后面的非空白字符,直到遇到另一个空白字符为止,并在串尾放一个字符串结束标志"\n"。因此输入字符串遇到空格时,就当作本数据输入结束。 (3)数据输入时,系统除检查是否有空白外,还检查输入数据与变量的匹配情况。

39 7.3 预定义类型的输入输出 7.3.1 插入运算符与提取运算符 7.3.2 输入输出的格式控制

40 例7.3 (P296) 1. 用流对象的成员函数控制输出格式 表7.2 用于控制输入输出格式的流成员函数(P295)
表7.3 类ios中定义的状态标志(P295) 例7.3 (P296)

41 在很多情况下,使用操纵符进行格式化控制比用ios状态标志和成员函数要方便。
2. 使用预定义的操作符进行输入输出格式控制 这一方法使用了一种称为操纵符(也称为操纵函数或控制符)的特殊函数。 操纵符分为: *不带形参的操纵符 *带形参的操纵符符 在很多情况下,使用操纵符进行格式化控制比用ios状态标志和成员函数要方便。

42 2. 使用预定义的操作符进行输入输出格式控制 C++提供的预定义操纵符如下: dec 设置整数的基数为10,用于输入/输出
hex 设置整数的基数为16用于输入/输出 oct 设置整数的基数为8用于输入/输出 ws 用于在输入时跳过开头的空白符,用于输入 endl 输出一个换行符并刷新输出流,用于输出 ends 插入一个空字符null,通常用来结束一个字符串, 用于输出 flush 刷新一个输出流,用于输出 setbase(n) 设置整数的基数为n(n的取值为0,8,10 或16),n 的默认值为0,即以十进制形式输出。用于输入/输出 setfill(c) 设置c为填充字符,默认时为空格,用于输出 setprecision(n) 设置实数的精度为n位,在以一般十进制 小数形式输出时n代表有效数字。在以fixed(固定 小数位数)形式和scientific(指数)形式输出时 n为小数位数设置域宽为n,用于输出

43 2. 使用预定义的操作符进行输入输出格式控制 setw(n) 设置域宽为n, 用于输出
setiosflags(f) 设置由参数f指定的状态标志, 用于输入/输出 resetiosflags(f) 终止由参数f指定的状态标志,

44 2. 使用预定义的操作符进行输入输出格式控制 带有常用的状态标志的操纵符setiosflags和 resetiosflags
setiosflags(ios::left) 数据按域宽左对齐输出 setiosflags(ios::right) 数据按域宽右对齐输出 setiosflags(ios::fixed) 固定的小数位数显示 setiosflags(ios::scientific) 设置浮点数以科学表示法 (即指数形式)显示 setiosflags(ios::showpos) 在正数前添加一个“+”号输出 setiosflags(ios::uppercase) 在以科学表示法格式E和以 十六进制输出字母时用大写表示 resetiosflags(f) 终止已设置的状态标志,在括 号中应指定f的内容

45 3. 使用用户自定义的操作符进行输入输出格式控制
自定义的输出流操纵符函数格式如下: ostream& 操纵符名(ostream& stream) { 自定义代码 return stream; } 两者应该一致 输出流类

46 例7.6 用户自定义操纵符的使用方法举例1。 #include<iostream> #include<iomanip> using namespace std; ostream &output1(ostream &stream) { stream.setf(ios::left); stream<<setw(10)<<hex<<setfill('&'); return stream; } int main() { cout<<123<<endl; cout<<output1<<123<<endl; return 0; 自定义操纵符函数名 程序运行结果如下: 123 7b&&&&&&&&

47 自定义的输入流操纵符函数格式如下: istream& 操纵符名(istream& stream) { 自定义代码
return stream; } 两者应该一致 输入流类

48 例7.7 用户自定义操纵符的使用方法举例2。 #include<iostream> #include<iomanip> using namespace std; istream &input1(istream &in) { in>>hex; cout<<"Enter number using hex format:"; return in; } int main() { int i; cin>>input1>>i; cout<<"hex: "<<hex<<i<<"------dec:"<<dec<<i<<endl; return 0;} 程序运行后,屏幕上显示: Enter number using hex format: 提示用户输入一个十六进制数,例如23ae↙ hex: 23ae------dec:9134

49 第7章 C++流类库与输入输出 7.1 C++为何建立自己的输入输出系统 7.2 C++流的概述 7.3 预定义类型的输入输出
7.4 用户自定义类型的输入输出 7.5 文件的输入输出 7.6 命名空间和头文件命名规则 7.7 应用举例

50 7.4 用户自定义类型的输入输出 7.4.1 重载插入运算符 7.4.2 重载提取运算符

51 第7章 C++流类库与输入输出 7.1 C++为何建立自己的输入输出系统 7.2 C++流的概述 7.3 预定义类型的输入输出
7.4 用户自定义类型的输入输出 7.5 文件的输入输出 7.6 命名空间和头文件命名规则 7.7 应用举例

52 7.5 文件的输入输出 7.5.1 文件的打开与关闭 7.5.2 文件的读写

53 7.5.1 文件的打开与关闭 打开文件是指在文件读写之前做必要的准备工作(建立文件流对象与磁盘文件的关联;指定文件的工作方式等)。
关闭文件是指解除该磁盘文件与文件流的关联,原来设置的工作方式也失效。

54 7.5.1 文件的打开与关闭 1. 打开文件 格式: 文件流对象.open(文件名 ,打开方式);
如:out.open("test.dat",ios::out); 格式: 文件流对象.open(文件名 ,打开方式); 表7.7 文件打开方式(P307)

55 7.5.1 文件的打开与关闭 2. 关闭文件 格式: 流文件对象.close( ); 如: out.close();

56 7.5 文件的输入输出 7.5.1 文件的打开与关闭 7.5.2 文件的读写

57 7.5.2 文件的读写 1. 文本文件的读写 例7.10(P309) 例7.11(P310)
程序对文本文件的操作与对键盘、显示器的操作比较: 内存变量 (程序) 键盘 输入文件 屏幕 输出文件 cin>>x cout<<x infile>>x outfile<<x 在涉及文本文件的操作时,将输入文件看成键盘,将输出文件看成显示器,格式不变。只需在程序中增加打开与关闭文件的语句。 //例7.10(P309) #include<iostream> #include<fstream> using namespace std; int main() { ofstream fout("f1.dat",ios::out);//定义输出文件流对象fout,打开输出文件f1.dat if(!fout) //如果文件打开失败,fout返回0值 cout<<"Cannot open output file\n,"; return 1; } fout<<10<<" "<< <<"\"This is a text file.\"\n";//把一个整数、一个浮点数和一个字符串写到磁盘文件f1.dot中 fout.close();//将与流对象fout所关联的输出文件f1.dat关闭 return 0; 例7.10(P309) 例7.11(P310)

58 7.5.2 文件的读写 2. 二进制文件的读写 若在文件的打开方式中没有特别说明,打开的文件均为ASCII码文件,若要打开二进制文件,则要特别说明并用特定的读写函数。 fstream infile,outfile; infile.open("inf1.dat", ios::in| ios::binary); 二进制文件 输入方式打开 文件名 outfile.open("outf1.dat", ios::out| ios::binary); 二进制文件 文件名 输出方式打开

59 3. 用成员函数read和write读写二进制文件
输入函数: infile.read( char *buffer, int len ) 一次读入的字节数 读入 文件 内存 输入文件对象名 数据进入的内存地址 写出 内存 文件 一次输出的字节数 例7.14(P251) 输出函数: outfile.write( const char *buffer, int len) 例7.15(P252) 输出文件对象名 要输出的数据在内存中的地址

60 4. 随机访问二进制数据文件 例7.15(P316)

61 与文件指针有关的流成员函数 infile.seekg(100, ios::beg);//移动到距文件头100个字节
infile.seekg(int, ios::_dir); _dir: beg: 文件头 cur: 当前位置 end: 文件尾 移动的字节数 相对位置 infile.seekg(100, ios::beg);//移动到距文件头100个字节 infile.seekg(-100, ios::cur);//移动到距当前位置前100个字节 infile.seekg(-500, ios::end);//移动到距文件尾前500个字节

62 第7章 C++流类库与输入输出 7.1 C++为何建立自己的输入输出系统 7.2 C++流的概述 7.3 预定义类型的输入输出
7.4 用户自定义类型的输入输出 7.5 文件的输入输出 7.6 命名空间和头文件命名规则 7.7 应用举例

63 7.6 命名空间和头文件命名规则 7.6.1 命名空间 7.6.2 头文件命名规则

64 #include<iostream>
using namespace std; namespace a { int x=1; } namespace b int x=2; int main() int x=3; cout<<a::x<<endl; cout<<b::x<<endl; cout<<x<<endl; return 0; 7.6.1 命名空间 由程序设计者命名的内存区域。程序设计者可以根据需要指定一些有名字的命名空间,将各命名空间中声明的标识符与该命名空间标识符建立关联,保证不同命名空间的同名标识符不发生冲突。 #include<iostream> using namespace std; namespace a { int x=1; } namespace b int x=2; int main() int x=3; cout<<a::x<<endl; cout<<b::x<<endl; cout<<x<<endl; return 0;

65 7.6 命名空间和头文件命名规则 7.6.1 命名空间 7.6.2 头文件命名规则

66 7.6.2 头文件命名规则 由于C++是从C语言发展来的,为了与C兼容,C++保留了C语言中的一些规定。
如在C语言中头文件用“.h”作后缀,为了与C语言兼容,许多C++早期版本的编译系统头文件都采用“.h”形式,为了使原来编写的C++程序能运行,两种头文件都可以使用。

67 7.6.2 头文件命名规则 1.带后缀的头文件的使用 由于C语言没有命名空间,头文件不存放在命名空间中,因此C++程序中,使用带后缀“.h”的头文件,不用命名空间。 2.不带后缀的头文件的使用 C++标准要求系统提供的头文件不包括后缀“.h” ,为了表示C++与C语言的头文件既有联系又有区别,C++所用的头文件不带后缀“.h”,而是在C语言的相应的头文件名前加前缀c。如stdio.h,在C++中为cstdio。

68 第7章 C++流类库与输入输出 7.1 C++为何建立自己的输入输出系统 7.2 C++流的概述 7.3 预定义类型的输入输出
7.4 用户自定义类型的输入输出 7.5 文件的输入输出 7.6 命名空间和头文件命名规则 7.7 应用举例

69 Practice, Practice, and Practice
Q & A Practice, Practice, and Practice Object-Oriented Programming 汽车学院


Download ppt "面向对象程序设计 QQ群:343072849 Object-Oriented Programming 汽车学院."

Similar presentations


Ads by Google