博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++技术点积累(6)——异常处理、输入和输出流
阅读量:4124 次
发布时间:2019-05-25

本文共 5489 字,大约阅读时间需要 18 分钟。

1、异常处理机制:

1、异常是一种程序控制机制,与函数机制独立和互补

  函数是一种以栈结构展开的上下函数衔接的程序控制系统,异常是另一种控制结构,它依附于栈结构,却可以同时设置多个异常类型作为网捕条件,从而以类型匹配在栈机制中跳跃回馈.

2、异常设计目的:

   栈机制是一种高度节律性控制机制,面向对象编程却要求对象之间有方向、有目的的控制传动,从一开始,异常就是冲着改变程序控制结构,以适应面向对象程序更有效地工作这个主题,而不是仅为了进行错误处理。

1) 若有异常则通过throw操作创建一个异常对象并抛掷。

2) 将可能抛出异常的程序段嵌在try块之中。控制通过正常的顺序执行到达try语句,然后执行try块内的保护段。

3)如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句就不执行。

4catch子句按其在try块后出现的顺序被检查。匹配的catch子句将捕获并处理异常(或继续抛掷异常)。

5) 如果匹配的处理器未找到,则运行函数terminate将被自动调用,其缺省功能是调用abort终止程序。

6处理不了的异常,可以在catch的最后一个分支,使用throw语法,向上扔。

7)    C++的异常处理机制使得异常的引发异常的处理不必在同一个函数中,这样底层的函数可以着重解决具体问题,而不必过多的考虑异常的处理。上层调用者可以在适当的位置设计对不同类型异常的处理。

 

        异常捕捉严格按照类型匹配,异常捕捉的类型匹配之苛刻程度可以和模板的类型匹配媲美,它不允许相容类型的隐式转换。

 

 

2、输入和输出流:
                  

1)标准输入流对象cin:

        cin.get()    //一次只能读取一个字符
        cin.get(一个参数)     //读一个字符
        cin.get(三个参数)     //可以读字符串
        cin.getline()
        cin.ignore()
        cin.peek()
        cin.putback()

#include 
using namespace std;#include "string"//get()void main09(){ char ch; while ((ch = cin.get()) != EOF) //Ctrl+z终止输入 { cout << ch << endl; } system("pause");}void main73(){ char a, b, c; cout << "cin.get(a) 如果缓冲区没有数据,则程序阻塞 \n"; cin.get(a); cin.get(b); cin.get(c); cout << a << b << c << "因为缓冲区有数据,程序不会阻塞\n"; cin.get(a).get(b).get(c); cout << a << b << c; system("pause");}//getline函数可以接受 空格void main089(){ char buf1[256]; char buf2[256]; cout << "请输入一个字符串 含有多个空格 aa bb cc dd\n"; cin >> buf1; // 遇见空格停止接受 数据 cin.getline(buf2, 256); //字符串刚开始的空格,最后的空格都会读入,回车结束输入 cout << "buf1:" << buf1 << ",buf2:" << buf2 << "结束" << endl; system("pause");}void main75(){ char buf1[256]; char buf2[256]; cout << "请输入一个字符串 含有多个空格aa bbccdd\n"; cin >> buf1; cin.ignore(2); //cin.ignore()忽略后面的两个空格 int myint = cin.peek(); //cin.peek()看一把 cout << "myint:" << myint << endl; cin.getline(buf2, 256); cout << "buf1:" << buf1 << "\nbuf2:" << buf2 << endl; system("pause");}//案例:输入的整数和字符串分开处理int main(){ cout << "Please, enter a number or a word: "; char c = std::cin.get(); if ((c >= '0') && (c <= '9')) //输入的整数和字符串 分开处理 { int n; //整数不可能 中间有空格 使用cin >>n cin.putback(c); cin >> n; cout << "You entered a number: " << n << '\n'; } else { string str; cin.putback(c); //cin.getline(str); getline(cin, str); // //字符串 中间可能有空格 使用 cin.getline(); cout << "You entered a word: " << str << '\n'; } system("pause"); return 0;}

2)标准输出流对象cout:

       cout.flush()
       cout.put()
       cout.write()
       cout.width()
       cout.fill()
       cout.setf(标记)
#include 
using namespace std;#include
/*manipulator(操作符、控制符)flushendloctdechexsetbasesetwsetfillsetprecision*/void main011(){ cout << "hello" << endl; cout.put('h').put('e').put('l'); char *p = "hello itcast"; cout.write(p, strlen(p)) << endl; cout.write(p, strlen(p) - 4) << endl; //设置输出的长度 cout.write(p, strlen(p) + 4) << endl; //危险! system("pause"); return;}void main022(){ //使用类成员函数 cout << "
"; cout.width(30); //设置输出的长度 cout.fill('*'); //设置填充效果 cout.setf(ios::showbase); //#include
//显示基准0x //cout.setf(ios::internal); //设置 隔离 cout << hex << 123 << "
\n"; //hex十六进制输出 cout << endl << endl; //使用控制符 cout << "
" << setw(30) << setfill('*') << setiosflags(ios::showbase) //基数 << setiosflags(ios::internal) //设置 隔离 << hex << 123 << "
\n" << endl;}int main033(){ int a; cout << "input a:"; cin >> a; cout << "dec:" << dec << a << endl; //以十进制形式输出整数 cout << "hex:" << hex << a << endl; //以十六进制形式输出整数a cout << "oct:" << setbase(8) << a << endl; //以八进制形式输出整数a char *pt = "China"; cout << setw(10) << pt << endl; //指定域宽为,输出字符串 cout << setfill('*') << setw(10) << pt << endl; //指定域宽,输出字符串,空白处以'*'填充 double pi = 22.0 / 7.0; //计算pi值 //按指数形式输出,8位小数 cout << setiosflags(ios::scientific) << setprecision(8); cout << "pi=" << pi << endl; //输出pi值 cout << "pi=" << setprecision(4) << pi << endl; //改为位小数 cout << "pi=" << setiosflags(ios::fixed) << pi << endl; //改为小数形式输出 system("pause"); return 0;}int main044(){ double a = 123.456, b = 3.14159, c = -3214.67; cout << setiosflags(ios::fixed) << setiosflags(ios::right) << setprecision(2); cout << setw(10) << a << endl; cout << setw(10) << b << endl; cout << setw(10) << c << endl; system("pause"); return 0;}

3)文件流类和文件流对象

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

ofstream类的默认构造函数原形为:

ofstream::ofstream(constchar *filename,  int mode = ios::out,  int penprot = filebuf::openprot);
     filename:  要打开的文件名
     mode:    要打开文件的方式
     prot:    打开文件的属性
在定义ifstream和ofstream类对象的时候,我们也可以不指定文件。以后可以通过成员函数open()显式的把一个文件连接到一个类对象上。
     ofstream myfile;      myfile.open("c:\\1.txt",ios::out|ios::app,0); 
     ifstream  myfile;      myfile.open("c:\\1.txt",ios::in,0); 
     fstream   myfile;      myfile.open("c:\\1.txt",ios::out|ios::app,0);      //同时读写

mode属性表

ios::app    以追加的方式打开文件
ios::ate    文件打开后定位到文件尾,ios:app就包含有此属性
ios::binary   以二进制方式打开文件,缺省的方式是文本方式
ios::in   文件以输入方式打开
ios::out   文件以输出方式打开
ios::trunc   如果文件存在,把文件长度设为0

可以用“|”把以上属性连接起来,如ios::out | ios::binary。

openprot属性表

属性       含义
0       普通文件,打开访问
1       只读文件
2       隐含文件
4       系统文件

A.C++对ASCII文件的读写操作   ——http://blog.csdn.net/songshimvp1/article/details/48049135

       如果文件的每一个字节中均以ASCII代码形式存放数据,即一个字节存放一个字符,这个文件就是ASCII文件(或称字符文件、文本文件)。程序可以从ASCII文件中读入若干个字符,也可以向它输出一些字符。

B.C++对二进制文件的读写操作 ——http://blog.csdn.net/songshimvp1/article/details/48049135 

       二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件。因为文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件。
       对二进制文件的操作也需要先打开文件,用完后要关闭文件。在打开时要用ios::binary指定为以二进制形式传送和存储。二进制文件除了可以作为输入文件或输出文件外,还可以是既能输入又能输出的文件。这是和ASCII文件不同的地方。
       对二进制文件的读写主要用istream类的成员函数read和write来实现。这两个成员函数的原型为:
             istream&     read(char *buffer,int len);
             ostream&    write(const char * buffer,int len);
       字符指针buffer指向内存中一段存储空间。len是读写的字节数。调用的方式为:
             fout. write(p1,50);
             fin. read(p2,30);

你可能感兴趣的文章
python 变量作用域问题(经典坑)
查看>>
pytorch
查看>>
pytorch(三)
查看>>
pytorch(5)
查看>>
ubuntu相关
查看>>
C++ 调用json
查看>>
nano中设置脚本开机自启动
查看>>
动态库调动态库
查看>>
Kubernetes集群搭建之CNI-Flanneld部署篇
查看>>
k8s web终端连接工具
查看>>
手绘VS码绘(一):静态图绘制(码绘使用P5.js)
查看>>
手绘VS码绘(二):动态图绘制(码绘使用Processing)
查看>>
基于P5.js的“绘画系统”
查看>>
《达芬奇的人生密码》观后感
查看>>
论文翻译:《一个包容性设计的具体例子:聋人导向可访问性》
查看>>
基于“分形”编写的交互应用
查看>>
《融入动画技术的交互应用》主题博文推荐
查看>>
链睿和家乐福合作推出下一代零售业隐私保护技术
查看>>
Unifrax宣布新建SiFAB™生产线
查看>>
艾默生纪念谷轮™在空调和制冷领域的百年创新成就
查看>>