发布日期:2015-12-29 15:15 来源: 标签: 编程语言 C++教程 C++成员函数 C++输入输出
本章我们主要学习C++中怎样声明输入流成员函数和输出流成员函数?怎样提高标准输入/输出的健壮性?下面我们就做一下具体讲解,希望大家多多支持中国站长网络学院。
提高标准输入/输出的健壮性
◆ 1、标准设备输入使用要点:
1)cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢用,如果输入错了,必须在回车之前修改,如果回车键按下就无法挽回了。只有把输入缓冲区中的数据取完后,才要求输入新的数据。不可能用刷新来清除缓冲区,所以不能输错,也不能多输!
2)输入的数据类型必须与要提取的数据类型一致,否则出错。出错只是在流的状态字state(枚举类型io_state)中对应位置位(置1),程序继续。所以要提高健壮性,就必须在编程中加入对状态字state的判断。
3)空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输入。但如果是字符型和字符串,则空格(ASCII码为32)无法用cin输入,字符串中也不能有空格。回车符也无法读入。
4)输入数以后再输入字符或字符串:如果数后直接加回车,应该用cin.get()提取回车。如果还有空格,则要清空缓冲区。
◆ 2、程序运行状态:
状态字state为整型,其的各位在ios中说明:
enum ios_state
{
       goodbit=0x00, //流正常
       eofbit=0x01,  //输入流结束忽略后继提取操作;或文件结束已无数据可取
       failbit=0x02, //最近的I/O操作失败,流可恢复
       badbit=0x04, //最近的I/O操作非法,流可恢复
       hardfail=0x08     // I/O出现致命错误,流不可恢复,VC6.0++不支持
}
读取状态的有关操作如下:
inline int ios::rdstate() const //读取状态字
{return state;}
inline int ios:operator!() const //可用操作符!()代替fail()
{return state&(badbit|failbit);}
inline int ios::bad() //返回非法操作位
{ return state & badbit;}
inline void ios::clear(int _i) //人工设置状态,可用来清状态
{ lock();state=_i;unlock();}
inline int ios::eof() const //返回流(文件)结束位
{return state&eofbit;}
inline int ios::fail() const //返回操作非法和操作失败这两位
{return state&(badbit|failbit);}
inline int ios::good() const //正常返回1,否则返回0
{return state==0;}
标准输入/输出成员函数
1、输入流成员函数声明
(1)字符输入:
    int istream::get();
    //提取一个字符,包括空格,制表,backspace和回车等,
    //与cin有所不同.注意返回为整型
    istream&istream::get(char &);
    istream&istream::get(unsigned char &);
提取一个字符,放在字符型变量中
(2)字符串输入:
    istream&istream::get(char *,int,char=’\n’);
    istream&istream::get(unsigned char *,int,char=’\n’);
    istream&istream::getline(char *,int,char=’\n’);
    istream&istream::getline(unsigned char *,int,char=’\n’);
提取的串放在第一个参数为开始地址的存储区(不查边界);第二个参数为至多提取的字符个数(指定为n,最多取n-1个,再加一个字符串结束符);第三个参数为结束字符,遇此字符则结束,默认为回车换行符。
get系列函数要求单独提取结束字符。getline提取字符串时如遇到指定结束符则提取该结束符,但不保存在串中。这两个函数都会在提取的一系列字符后加一个串结束符,返回值为对象本身(*this)。
(3)其他函数:
函数gcount()返回最后一次提取的字符数量,包括回车:
    int istream::gcount();
函数ignore()读空(指定一个大的数量)缓冲区:
    istream&istream::ignore(int=1,int=EOF);
第一个参数为要提取的字符数量,默认为1;第二个参数为结束字符,提取该结束字符,但对所提取的字符不保存不处理,作用是空读。第二个参数的默认值EOF为文件结束标志。
在iostream中EOF定义为-1,在int get()函数中,读入输入流结束标志Ctrl+Z(^Z)时,函数返回EOF,为了能表示EOF的“-1”值,返回类型为int。采用cin.eof()函数,当前所读为EOF则返回非零,注意函数自身未从流中读取。
2、输出流成员函数声明:
    ostream&ostream::put(char);
    //输出参数字符
    ostream&ostream::put(unsigned char);
    ostream&ostream::put(signed char);
    ostream&ostream::flush();
    //刷新一个输出流,用于cout和clog
重载插入和提取运算符
重载必须保留原来的使用特性。重载只能在用户定义类中,将重载的运算符的函数说明为该类的友元函数:
    friend istream&operator>>(istream&,className&);
    friend ostream&operator<<(ostream&,className&);
函数的返回值是对输入或输出流的引用,这是为了保证在cin和cout中可以连续使用“>>”或“<<”运算符,与所有“>>”和“<<”重载函数一致。第一个参数是输入或输出流的引用,作为“>>”或“<<”的左操作数;第二个参数为用户定义类的引用,作为右操作数,流用作函数参数,必须是引用调用,不能是传值调用。

相关评论

专题信息
    C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C++支持多种编程范式 --面向对象编程、泛型编程和过程化编程。最新正式标准C++于2014年8月18日公布。 其编程领域众广,常用于系统开发,引擎开发等应用领域,是至今为止最受广大程序员受用的最强大编程语言之一,支持类:类、封装、重载等特性! 本教程从基础讲解了C++语言,希望对大家有所帮助,望多多支持中国站长网络学院。