`
yunchow
  • 浏览: 324350 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

c++链表 异常 内部类 输出格式控制

    博客分类:
  • C++
阅读更多
C(控制台)    F(文件)
---------------------------------------------
* I
	 cin			ifstream fin(文件名)

				fin.close()
	cin>>			fin>>
	cin.get(/*char&*/)	fin.get(/*char&*/)
	getline(cin/fin,str,'/*结束符*/')
	read(内存地址,字节数)//此时注意长度
	read()不会自动加'\0'
	clear()恢复错误状态,ignore()清缓冲
	peek()  putback()把读出的字符放回缓冲区

----------------------------------------------
* O
	cout			ofstream fout(文件名)
	cerr/clog		fout.close()
	<<
	put()
	write(内存地址,字节数)把内存中的数写到文件中
	string str;
	fin.read((char*)&str,sizeof(str));//结果不一定是想要的.
	如果要读的是字符就用字符数组
fin.gcount()//最近读到多少个字符
fin.eof()//判断是否读到了文件末尾

控制台与文件的输入输出是完全一样的.
EOF end of file  代表-1
================================================
* 输出格式控制

只对格式化输出有效 <<
指定输出宽度:cout.width(int),一次性的,只对下一个输出有效
cout.fill('&')//在空白地方填充指定字符,不是一次性的
//例子
#include <iostream>
using namespace std;

class wf{
        int w;
        char ch;
public :
        wf(int w, char c ):w(w),ch(c){}
        friend ostream& operator<<(ostream& os, const wf& o){
                os.width(o.w);
                os.fill(o.ch);
                return os;
        }
};

int main()
{
        cout << wf(10,'*') << 123 << endl;
        cout << 123 << endl;
}


设置输出精度
cout.precision(8);
cout.setf()//控制输出格式

添加控制标志
cout.setf(ios::left|ios::hex)

常见输出控制标志:
ios:right,ios:dec(十进制),ios:oct(八进制),ios:hex,ios::showbase(带

前缀,如ox),ios::showpoint(总带小数点),ios::scientific(科学计数法)
ios::showpos(positive带符号),ios::uppercase(大写,把十六进制和科学计


数输出A~F时变大写)

cout.precision(2);
cout.setf(ios::fixed);//合起来用,设置小数后几位.

cout.unsetf(标志)//清除标志


#include <iostream>
using namespace std;

int main()
{
        cout.width(10);
        cout.fill('*');
        cout.setf(ios::left);
        cout << 123 << endl;
        cout.setf(ios::showpos);
        cout << 123 << endl;
        cout.setf(ios::showpoint);
        cout << 123.0 << endl;
        cout.setf(ios::scientific|ios::uppercase);
        cout << 1234.0 << endl;
        cout.precision(2);
        cout.unsetf(ios::scientific);
        cout.setf(ios::fixed);
        cout << 123.0 << endl;
        cout.unsetf(ios::showpos);
        cout.unsetf(ios::dec|ios::oct);
        cout.setf(ios::hex);
        cout.setf(ios::showbase);
        cout << 123 << endl;
        cout << "hello,world" << endl;
}


输出控制符
flush:清空缓冲
endl:insert a '\n' ,and clear out buffer
oct : set the output as oct
dec :十进制输出
hex: 十六进制输出
cout.setf(ios::left);//cout<<left与其等价
setw(宽度) ----> width
setfill(填充字符) ---> fill
setprecision(精度) ---> precision


注意:要用以上格式要包含头文件<iomanip>

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
        cout << setw(10) << setfill('~') << left << 123 << endl;
        cout << hex << showbase << uppercase << 123 << endl;
}

===============================================
ofstream fout(文件名,方式/*默认ios::out*/);
默认会清除文件中原内容
打开方式:ios::app(追加内容)
ios::binary:open file in binary mode;原样读写
ios::ate:start reading or writing at end of file
ios::in:ipen for reading
ios::trunc:truncate file to zero length if it exitsts
ios::out:open for writing

seekg(位置int);//读定位
seekp(位置int);//写定位
tellp()
tellg()//返回当前位置

//既可读也可写
fstream fio(文件名,ios::in|ios::out);
一般提倡读写分开.
+ 保存对象
A a(23);
fout.write((char*)&a,sizeof(a));
有一点如果要保存string对象时要先将其转换成c_str风格再转.
因为string里是一个指针,它的长度是4,如果保存的话会是一个地址,是毫无意

义的.
用法:fout.write((char*)strngObj.c_str(),strlen(strngObj));
-------------------------------
* 内部类

  在一个作用域范围内定义的类叫做内部类.我们可以在一个函数里定义一个类

,也可以在一个类里定义一个内部类.
#include <iostream>
using namespace std;
class A /*全局类*/ {
public:
	class B /*(成员)内部类*/ { };
	//int b;//成员变量
};

class B /*可以叫B*/ { };

class D {
public :
	class B { };
};

int main()
{
	class C { };//(局部)内部类
	//int c;//局部变量
	C objc;
	A obja;
	A::B objab;//内部类的访问方法.
	B objb;
	D::B objdb;
}

内部类的作用:隐藏名字,避免冲突.可以通过其中统一的内部类名来统一各个类

的操作方法.其中最著名的就是迭代器.其实迭代器是类的内部类.
在c++里内部类与外部类毫不相干.
-------------------------------------------------
* 异常

如果不用异常程序各处会出现错误处理代码,使程序显的混乱,而异常处理将会

把错误集中处理,让程序结构清晰起来.
异常是不常见,但无法避免,可预料并作准备.
try {
	if( 有异常情况 )
		throw 数据;//在c++里什么都可以抛
}//监视是否有数据抛出.
catch/* 扑获异常 */( 类型 变量名 ) {

	/* 对异常处理code */
}//catch是用来集中处理错误信息的
catch( 类型 变量名 ) {

	/* 对异常处理code */
}//可以有若干个catch,对不同的异常进行处理.

c++的异常处理就像小两口打架,想抛什么就抛什么.
//例子,异常处理
#include <iostream>
#include <fstream>
using namespace std;

int main(int argc, char* argv[])
{
     try {
	ifstream fin(argv[1]);
	if(!fin)
		throw 100;
	char buf[1000];
	fin.read(buf,1000);
	if(!fin)
		throw 100.0;
	cout.write( buf, 1000);
	fin.close();
	
     }catch(double e) {
	cout << "double:" << e << endl;
     }catch(long e) {
	cout << "long:" << e << endl;
     }catch(...)/*接收所有的异常*/ {
	cout << "Exception Error!" << endl;
     }
     cout << "What a good day!" << endl;
		
}


exception类有一个成员函数what()用来返回描述异常的字符串e.what();
在一个函数里如果有没有被捕获的异常会被抛到调用它的地方.
最终会传到main函数里面.所以我们在main里写上下面语句块:
try { } catch(...) { } 这样就能处理所有的异常.
抛出子类型对象异常,可以用父类对象来进行捕获.当一起进行捕获,但要注意先

后顺序,一般是先catch子类再catch父类对象.
catch( 类型 变量 ) {
throw;
}//处理不了,重新抛出该异常.一般不这么做,偶尔做一做
其中的类型可以是自定义类型,同样可以向外抛.
====================================================

* 重要数据结构与算法

  + 链表
结构中也可以写构造函数,结构与类的区别最主要的区别就是结构中默认的成员

是public型的,而类中成员默认是private型的.其他的大致相同.
基本类型()的值是0
T(),T是基本类型时值是0,T是类时T()会是一个无名对象.
当然编译器有可能会优化程序.

//链表示例
#include <iostream>
using namespace std;
typedef int T;

int main()
{
        struct Node {
                T data;
                Node* next;
                Node(const T& d) : data(d),next(NULL){ }
        };
        Node* header = NULL;
        cout << "Please input some integers : " << endl;
        do{
                T data;
                cin >> data;
                //cout << (int)data << ' ';
                Node* p = new Node(data);
                p->next = header;
                header = p;
        }while(cin.get()!='\n');
        Node* p = header;
        while(p){
                cout << p->data << ' ';
                p = p->next;
        }
        cout << endl;
	p = header;
        while(p){
                Node* q = p->next;
                delete p;
                p = q;
        }
}


//链表类示例程序
//功能:支持增,删,改,查
#include <iostream>
using namespace std;
typedef int T;

class List {
        struct Node {
                T data;
                Node* next;
                Node( const T& t=T()) : data(t),next(NULL){ }
        }; //end of struct Node

        Node* head ;

public:
        List() : head(NULL){ }
        void insertFirst( const T& t ){
                Node* p = new Node(t);
                p->next = head;
                head = p;
        }
        void travel(){
                Node* p = head;
                while(p){
                        cout << p->data << ' ' ;
                        p = p->next;
                }
                cout << endl;
        }
        void free(){
                while(head){
                        Node* q = head->next;
                        delete head;
                        head = q;
                }
        }
        int size(){
                Node* p = head;
                int cnt=0;
                while(p){
                        p = p->next;
                        cnt ++;
                }
                return cnt;
        }
        ~List(){
                free();
                cout << "~List() called" << endl;
        }
        int find( const T& t ){
                Node* p = head;
                int cnt = 0;
                while(p){
                        if(p->data==t) return cnt;
                        p = p->next;
                        cnt++;
                }
                return -1;
        }
        T getHead(){
                if(!head) throw "Exception: No head";
                return head->data;
        }
        T getTail(){
                if(!head) throw "Exception: No tail";
                Node* p = head;
                while(p->next)
                        p = p->next; 
                return p->data;
        }
        T get( int index ){
                Node* p = getPointer(index);
                return p->data;
        }
        bool erase( int index ){
                if( 0== index ){
                        Node* p = head;
                        head = head->next;
                        delete p;
                        return true;
                }
                else{
                        Node* pre = getPointer(index-1);
                        Node* cur = pre->next;
                        pre->next = cur->next;
                        delete cur;
                        return true;
                }
                return false;
        }
        bool update(const T& old, const T& nw){
                int index=find(old);
                if(index<0)
                        return false;
                Node* p = getPointer(index);
                p->data = nw;
                return true;
        }
private :
        Node* getPointer(int index){
                if(index<0 || index>=size()){
                        throw "Exception:index out of bound" ;
                }
                Node* p = head;
                for( int i=0; i<index; i++)
                        p = p->next;
                return p;
        }
};//end of class List
int main()
{
        List list;
        list.insertFirst(1);
        list.insertFirst(2);
        list.insertFirst(3);
        list.insertFirst(4);
        list.insertFirst(5);
        list.travel();
        cout << "list.size():" << list.size() << endl;
        cout << "list.find(2):" << list.find(2) << endl;
        cout << "list.find(9):" << list.find(9) << endl;
        cout << "getHead:" << list.getHead() << endl;
        cout << "getTail:" << list.getTail() << endl;
        cout << "get(3):" << list.get(3) << endl;
        try{
                cout << "get(9):" << list.get(9) << endl;
        }
        catch(...){
                cout << "Exception" << endl;
        }
        //cout << "get(5):" << list.get(5) << endl;//ERROR
        cout << "------------------" << endl;
        list.erase(0);
        list.travel();
        try{
                list.erase(2);
        }
        catch(...){cout << "Exception" << endl;}
        list.travel();
        list.update(1,100);
        list.travel();
}

0
0
分享到:
评论

相关推荐

    C++课件 类和对象 数入输出 运算符重载 继承派生 指针数组等等课件

    这个课件主要涵盖了C++的几个核心概念和技术,包括类和对象、数值输入输出、运算符重载、继承与派生以及指针和数组。下面将详细阐述这些知识点。 1. **类和对象**:在C++中,类是数据和操作数据的方法的集合,是...

    C++语言设计【代码集合】

    C++是C语言的扩展,增加了类、模板、异常处理等高级特性。它支持过程化编程、面向对象编程和泛型编程,因此被广泛应用于系统软件、应用软件、游戏开发、驱动程序等多个领域。 1. **基础语法** - 变量:在C++中,...

    掌握c++标准类

    综上所述,掌握C++标准类涉及多个方面,包括但不限于理解容器的使用、迭代器的遍历、算法的应用、函数对象的编写、模板的使用以及异常处理的技巧。只有深入学习并熟练运用这些知识点,才能真正地称得上掌握了C++标准...

    达内C++内部讲义大全

    《达内C++内部讲义大全》是一份深入学习C++编程的重要资料,它涵盖了C++语言中的核心概念以及在Linux环境下进行程序开发的关键知识。这份讲义是著名培训机构达内的内部教学材料,旨在帮助学员全面掌握C++编程技能,...

    C++ API帮助手册

    C++ API的核心是它的标准库,也称为C++ Standard Library,它包含了一系列通用的容器(如vector、list、map等)、算法(如排序、查找、迭代)、输入/输出流(iostream)以及异常处理等功能。这些功能都是通过类和...

    c++资料合集

    封装允许我们将数据和操作隐藏在类的内部,保护数据不被外界直接访问。继承使得一个类可以继承另一个类的属性和方法,实现代码复用。多态则允许不同类型的对象对同一消息作出不同的响应,增强了程序的灵活性。 C++...

    c++写的航班管理系统

    这个类可能作为航班类的内部实现,或者作为独立的辅助类。 3. **主函数(Main Function)**:用户交互界面,负责接收用户输入,调用链表类和航班类的方法来执行相应的操作。 4. **输入/输出处理**:C++中的`...

    c++reference

    8. **标准库**:C++标准库提供了大量预先定义的类和函数,如输入/输出流(iostream)、容器(如vector和list)、算法(如排序和查找)、智能指针等。`C++ Reference.chm`很可能详细介绍了这些库的使用方法。 9. **...

    自学必备c++ 代码

    C++的基础语法包括变量声明、数据类型(如int、char、float、double等)、运算符(算术、关系、逻辑、赋值等)、控制结构(如if-else、switch-case、for、while循环)、函数定义与调用等。在Unix环境下,C++程序的...

    c++模拟网上购物商城

    - 封装是对象导向的另一个关键概念,它隐藏了类内部的实现细节,只暴露必要的接口供外部使用。 7. **错误处理**: - 程序可能需要处理各种异常情况,例如用户输入非法、商品不存在、库存不足等,这通常通过异常...

    C++-达内科技内部资料.ppt

    异常处理是C++的错误处理机制,确保程序在遇到错误时能够优雅地恢复或退出。 程序设计语言的发展从低级语言到高级语言,经历了从机器码、汇编语言到高级语言的转变。C++作为一款块结构语言,强调封装、数据作用域的...

    c++课件 电子科技大学

    在C++的初步学习中,首先会介绍基本语法,包括变量、数据类型(如int、float、char等)、运算符(算术、比较、逻辑等)、流程控制语句(如if条件语句、for循环、while循环)以及函数的使用。这些是所有编程语言的...

    音像租赁系统C++版

    音像租赁系统是一种常见的软件应用,它主要用于管理音像制品的出租、归还以及相关的会员管理、库存控制等业务流程。在这个C++实现的音像租赁系统中,我们可以深入探讨C++编程语言在构建此类系统时所涉及的关键知识点...

    C++入门,C++基础

    通过try-catch块和自定义异常类,开发者可以更优雅地处理程序中的异常情况。 "多继承"是C++的另一特性,允许一个类继承多个父类,从而实现接口复用和代码共享。然而,多继承也可能带来二义性问题,这部分会讨论如何...

    C++从零开始

    - C++的I/O流库(iostream)提供了处理标准输入/输出的类,如cin和cout。 - 文件流(fstream)允许读写磁盘文件。 通过深入学习以上知识点,你将能够从零开始掌握C++编程,逐步编写出复杂的程序。"C++从零开始....

    用C++实现栈的创建、输出、入栈、出栈

    1. **存储元素的容器**:栈的内部实现可以使用数组或链表,这里我们选择动态数组(`std::vector`)来存储元素,因为它提供了灵活的大小调整和高效的操作。 ```cpp #include class Stack { private: std::vector...

    C++人事管理系统

    通过访问修饰符(public、private、protected),我们可以控制类的外部如何访问其内部成员,实现数据的隐藏和保护,增强代码的安全性。 2. **指针的使用**:在C++中,指针是直接存储内存地址的变量,它可以用来高效...

    Instructor's Manual for C++ How to Program

    本章主要介绍了C++中的流输入输出机制,包括基本的屏幕输入输出、文件读写操作以及如何控制输出格式等。通过实际案例,让读者掌握C++中的I/O操作技巧。 ### 八、模板 #### 知识点: 1. **函数模板**:创建泛型函数...

    C++实现ATM机.zip

    C++11引入了线程库,可以用来实现并发控制,如互斥量(mutex)和条件变量(condition variable)来保证数据的一致性。 综上所述,"C++实现ATM机"项目是一个全面展示C++特性和OOP概念的实例,涵盖了软件开发的多个...

    郑莉 《面向对象程序设计》例题代码

    8. **异常处理**:异常处理是C++中处理错误的一种机制,通过try、catch和throw语句,可以在程序运行时捕获和处理异常,提高程序的健壮性。 9. **文件输入输出**:C++提供了标准库支持文件的读写操作,可以将对象...

Global site tag (gtag.js) - Google Analytics