3. 标准C++还定义了四个附加流: win, wout, werr, wlog, 它们都是宽字符 版本的标准流。 4.格式化的I/0 流
1) 利用ios成员进行格式化
●设置skipws时,开始的空白字符(空格,换行)在输入流的时候将被丢弃。 ●设置了showbase川以显示数字的基数。例如十六进制数1F将显示0x1F; ●当设置fixed时,则用普通计数法显示浮点数。
●当设置了unitbuf时,缓冲区在每次插入操作之后都会被刷新, 2) 设置格式标记:
➢为了是指一个标记可以用setf ()函数。 Fmtflag setf (fmtflag flags);
例如: stream.set(ios:showpoint I ios::shawpos);
注意:因为格式标记是在ios 类中定义的,必须使用ios和作用域运算符访问他们的值,例:单独用showbase不能被识别,想被识别必须指定ios:: showbase; 3) Unsetf ()可以清除一 个或者多个格式标记。 Void unsetf ( fmtflags flags);
例如: stream.unsetf(ios:showpoint);
Fmtflags setf(mtflags flags1, fntflags flags2);flags2标记被清除,然后根据flags1指定的标记进行设置,注意: flag1 中的标记在flag2中有的标记设置了才生效。
4) Oct, dec, hex域统称为basefield; left, right, internal域称为adjustfield; scientific 和fixed域称为floatfield。
5) 基域,对齐城,浮点域标记互相排斥,在设置一一个标记时必须关闭另一个标记。 6)Fmtflags flags();既可以显示与cout相关的格式标志设置,还可以设首与某个流相关 的所用格式标记。 例:显示格式:
los:: fmtflags f;Long |;
f=(long)cout.flags();for(i=0x4000; i;i=i>>1}if(i&f) cout<<\"1\";else cout<<\"0\";cout<<\"\\n\";设置格式标记:
ls:fmtflags f=ios::showpos | ios:showbase | ios:oct I is:right;Cout.flags(f); 7)使用 width),precion,(,ill()函数可以设置宽度,精度,填充。Couflill(*); 8)利用操作算子格式化1/0
➢改变流的格式参数的另 种方法是使用称为操作算子的些特 妹函数,这些函
数(操作算了)可以包含在I/0表达式中。例: cout< ➢<<:插入运算符,>>:提取运算符。重载插入和提取运算符的函数道常称为插入 器和析取器。 ➢创建白己的插入器 ostream &operator<<(ostream &stream, class_ type obj){//body of inserterReturn stream; ➢将一个插入器定 义为一个类的友元函数,就可以在插入器中直接访问对象的私 有属性了。 ➢创建自己的析取函数: istream &operator>>(istream &stream, class_ type obj){//body of inserterReturn stream; 5. 为了执行文件的1/0, 必须在程序中包括 1)创建 一个输入流,- 个输出流,一个既能输入 也能输出的流。 ifstream inofstream out;➢fstream io; 2) open函数 void ifstream::open(const char *filename, ios:openmode mode =ios:in); void ofstream::open(const char *filename, ios:openmode mode =ios:out | ios::trunc);void fstream::open(const char *filename, ios;openmode mode =ios:in | ios::out); 3) openmode是有ios定义的个枚举值,mode只能是下列中的一个或者几个: ➢ios:app 会使所有输出流到相应文件的内容都添加到文件末尾。 ios:ate 打开文件时能够定位到文件末尾。 is:binary使 文件以二进制方式打开。,默认都是以文本方式打开的。➢is:trunc 销毁具有相同名字的先前文件内容,并且把文件长度截断为0。➢ios:in ios::out 例: ofstream out; out.open(\"test' ,ios::out); 4) is_ _open()函数可以检查文件是否被成功打开。如果流链接到一 个打开文件,该流返回 true,否则返回false. 7.无格式和二进制I/0 流1) put ()和get ()函数 istream &get(char &ch)ostream &put(char ch) get ()丽数从一个调用流中读取一。 个字符并将该字符值放入ch,它返回对该流的 个引用。 ➢Put ()函数将ch写入相应的流并返回对该流的一一个引用。➢当遇到文件尾时, 该文件相关的流变成为false .2) read ()和write ()雨数 istream &read(char *buf, streamsize num) ostream &write(const char *buf, streamsize num )例: out.writel(char*) &acc, sizeof(struct status));int.read((char*) &acc, sizeof(struct status)); 3) get 除了前面讲了还可以以几种不同的方式被重载,如下: istream &get (char *buf, streamsize num); istream &get Cchar *buf, streamsize um, char delim);intget() ➢istream &get (char *buf, streamsize num); 把字符读入由buf指向的数组,直到读取到了num-1个字符,发现了换行符,文件尾结束。 ➢istream &get (char *buf, streamsize num, char delim); 把字符读入buf数组中,直到读取到了num-1个字符,发现了delim指定字符,文件尾结束。 ➢intget () 返回相应流中的下一个字符。如果遇到文件尾,则返回EOF.4) getline()函数 istream &getline (char *buf, streamsize nurn); istream &getline (char *buf, streamsize num, char delim);➢istream &getline (char *buf, streamsize num); 把字符读入由buf指向的数组,直到读取到了num-1个字符,发现了换行符,文件尾结束。 ➢istream &getlinechar *buf, streamsize num, char delim); 把字符读入buf数组中,直到读取到了num-1个字符,发现了delim 指定字符,文件尾结束 注意: getline ()从输入流中读取并删除分隔符,get ()则把分隔符流留流中。5) eof ()可以检测是否到达了文件尾。例whilel(in.eof()6) ignore()函 数 istream &ignore < streamsize num=1,int_ type delim=EOF ) ;跳过流中的num个字符,或是遇到了EOF终止符提前终止。例: in.ignore(10,\"); 7) peek()和putback 0)函数 ➢int _type peek(); 该函数返回流中的下一字符, 如果遇到文件尾,则返回EOF. ➢istream &putback(char c); 可以返回从个流中读取的最后个字符,c是读取的最后一个字符。8) seekg()函数个 seekp ()可以执行随机访问。 istream&seekg ( off _type offset, seekdir origin)ostream &seekp(off_ type offset, seekdir origin ) 获取指针(get pointer):该指针指定文件中下一个输入操作发生的位置:放置指针(put pointer):该指针指定文件中下一一个操作发生的位置。Origin必须是下面二个中的一个: .oS: : beg 文件头los: : cul 当前位置los:: end 文件尾例: in.seekp(8, ios::beg); In. get(c); 9) pos_ type tllg()和pos_ type tellp()函数可以确定每一 一个文件的当前指针位置,它们的返回 直 8.1/0 状态 i/o系统的当前状态保存在一个iostate类型的对象中,它是ios定义的枚举类型: 名字 Ios::googbit ios::eofbit ios::failbit ios::badbit 含义 无错误位设置 当遇见文件尾时为1,否则为0. 出现非致命的i/o错误时为1,否则为0。 出现致命的i/o错误时为1,否则为0。 ➢可以用下面的函数来判断是否出现了错误: bool bad ( )boole eof()bool fail)bool good() 例: whil(lin.baa)...}. ➢可以用clear()删除错误标记。 void clear ( iostate flags=ios:: goodbit); 如果flags是goodbit (默认值),所用的错误标记都将被删除。 9.mutable成员可以被const成员函数修改。 10.volatileintI;表示i是随时可能发生变化的,每次使用它都必须从i的地址中取出。 11.explicit构造函数阻止隐含地创建一一个从参数类型到类类型的转换。 class myclass{ int a; public: myclass(int x){ a=x; { … } myclass ob=4;在加了explicit 后就只能myclass ob (4)创建对象,不能用前面那种了。 12.--个绑定器可以把一个参数和一-个函数对象绑定在一起,一个取反器将返回 一个谓词的补码。 13.除bitset以外,-个容器在增加元素时自动增大,删除元素时自动减小。14.顺序容器和关 联容器; 1)顺序容器: 将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素, 这就是顺序容器。顺序容器的元索排列次序与元索值无关,而是由元素添加到容器里的次序决定。 2) 关联容器(Associative containers) 支持通过键来高效地查找和读取元素 关联容器和顺序容器的本质区别在于:关联容器通过键(KEY)存储和读取元素,而顺.序容器则通过元素在容器中的位置存储和方问元素, 3)关联容器和关联容器都提供了成员隔数begin()和end()雨数。15. vector容器1) vector 模版 template ➢explicit vector(size_ type num, const T &val=T(), const Allocator &a=Allocator())vector(const vector end():返回一个指向矢量容器未端的迭代器。push_back0);把一个值放骨在矢量容器的末端。insert ( ):可以在容器中间添加元素。 ➢erase ()从矢量容器中删除元素。erase (D); 删除i所指向的元素并返回删除元素 后面的元素的迭代器。 16. list 容器 1) list 模版 template explicit list(const Allocator &a=Allocator) explicit list(size_type num, const T &val=T(), const Allocator &a=Allocator()) list(const vector 3) list 的常用成员函数: push_back()函数可以把元素放入一个列表的末尾。 push_front()函数可以把元素放入列表的前面。 splice()可以把两个列表连接起来。 merge()可以把一个列表合并入另一个列表。 17. map 容器 1) map 模版 template explicit map(const Comp &cmpfn=Comp(), const Allocator &a=Allocator()) map(const map 例:map m.insert(pair m.insert(make_pair('A',9)); 18.算法 1) 算法作用于容器,他们提供操作容器内容的方法,他们做的事包括初始化,排序, 搜索和转换容器内容。 2) 所用算法都是模版函数,可以把算法应用于任何类型的容器。 3) 计数 1) template 2) template count_if()算法返回序列中使一元函数pfn返回true 的元素个数。 例: 1) count vector count(v.begin(),v.end(),true)//意为在v中v.begin()到 v.end()之间匹配true的个数。 2) count_ _if bool abc(int i){if(i%3==0)return true; : count_ ifv.begin(),b.end(),abel;//把 v中的全部元素都传入abc函数中,记录返回true的个数。 4) 删除与替换元素 )删除 template OutInter remove_ copy(Inter start, Inter end, Outnter result, const T &val)➢remove__copy()算法复制指定范围内的元素并则除值为value的那些元 素,他把结果放入由result指向的序列并返回一个指向结果末端的迭代器. 例: remove. cop(.begin),v.end(),v2.begin(),' )把向量v从开始到末尾复制到以v口的井始,并日删掉v2中的空格。b)替换 template OutInter replace_ copy(Inter start, Inter end, OutInter result, const T &old,const T &new) ➢replace_ copy()算法是从指定的范围复制元素并用new替换值为old 的元素。 例: replace_ copy(vbegin(), v.end). v2bein)\"?);把向量从开始到未尾都复制给v2,月把v2中的空格用“:”替换。 5) 序列变换 template Outiter transform(Inlter start1, Inlter end1, Inlter2 start2, Outiter result, Funcbinaryfunc) ➢transform()可以把一个函数应用于某个范围的元素并把结果存储在 result中。 double abd(double i){return 10/1; list p=transform(lst.begin(),lst. end(),Ist.bein(),abd); 1)二元函数对象 divides modulusnot_ equal. _to greater greater_ equal lessless_ equal logical and logical or 2)一元函数对象 logical not negate )内置函数对象是重载operator0的模版类,它返同对选定数据类型进行指定操作 的结果。 4)内置函数刘象需要用到头文件 5) 对float数据进行一元函数对象plus ()的语法: plus 5) transform()算法的使用 transform (Ist.begin(), Ist.end(), Ist.begin(), negate ➢绑定器的结构 bind1st(binfunc_ _obj, value)bind2nd(binfunc_ obj, value) 其中binfunc_ _obj 是一个二元函数对象,bind1st()返回个元函数对 象,该函数对象具有绑定到value的binfunc_ _obj 的左操作。bind2nd()返回一个一元函数对象,该函数对象具有绑定到value的bindfunc obj 的右操作数➢remove_ _if template ForInter remove_ if(Forlter start, Forlter end,UnPred func); 如果func定义的一元谓词为true, 该算法是从start和end定义的序列中删除一些元素, 然后返回一个指向新的序列末端的指针以反映出元素已被删除。例: litint>:iterator endp; endp=remove_ if(lst.begin(),lst.end(),bind2nd(greater not1(unary_ predicate)not2(unary_ predicate) 例: endp=remove_ if(lst.begin(), lst.end(),not1(bind2nd(greatersint>()81))20. string 类 1 一些string成员函数 可以把一一个字符串赋值给另-一个字符串,可以用assign(), 该函数的两种形式:string &assign(const string &strob, size_ type start, size_ type num)string &assign(const char *str,size_ type num)string &assign(const char *str, size_ type num) 第种形式中,函数将strob中从start指定的下标开始计数的num个字符赋给请用对象。 第_种方式中,以null结束的字符串str的前num个字符被赋值给调用对象.➢append 函数,两种形式 string &append (const string &strob, size. type start, size_ .type num)string &append(const char *str, size_ _type num) 第-一种形式,函数将strob中从start 指定的下标开始计数的num个字符添加到调用调用对象。 第二种形式,以null结束的字符str的前num个私服被添加到调用对象。➢insert (和replace ()函数的常用原型 string &insert(size_ type start, const &trob); string &insert(size_ type start, const string &strob, size_ type insStart, size_ type num) C++bind1st string &replace(size_ type start, size_ type num, const string &strob ) string &replace(size_ type start, size_ .type num, const string &strob, size_ type replaceStart, size_ type replaceNum) 第一种形式的insert函数按start指定的下标位置把strob插入到调用字符串中。 第二种形式的insert的数按start指定的下标位置把strob中从insStart开始的num个字符插入到调用字符串中。 第一一种形式的replace 函数用strob 替换调用字符串中从start开始的num个字符。 第二种形式的replace 函数用strob 指定的字符中从replaceStart 开始的replaceNum个宁符替换调用字符串中从start开始的orgNum个字符,返四一个调用对象的引用。 ➢erase()可以删除一个字符串中的字符 string &erase(size_ type start=Q,size_ type num=npos); 该函数从start开始删除调用字符串中的num个字符并返回一个调用字符串的引用。 ➢搜索字符串find 0)和rfind (),他们最常用的原型 size_ type find(const string &strob, size_ type start=0)const; size_ _type rfind(const string &strob, size_ type start=npos const; find()从start开始搜索调用字符串中第一次的包 含在strob中的字符。如果找到返回调用字符串出现匹配的下标。没找到则返回npos。rfind O)函数式搜索效用字符串中最后出现的strob。compare()函数。 int cormpare(size_ type start, size_ type num, const &string strob)const; 函数将对strob中从start 开始的num个宁符与调用字符串进行比较。如果调用字符串小于strob返回值小于0,大于则返回人于0,等于则返回值为0。21.基于C的输入/输出函数 1)基于c 是输入输出函数都要用到头文件#include 2) void clearer(File *stream)函数重置与stream所指的流相关的错误标记: 3) int fclose(FILE *stream)函数关闭与stream相关的文件并刷新相应的缓冲区.成功返 回0,否则返回EOF。 4) int foef (FILE *stream) 函数用来检查文件位置指示符以确定是否达到与stream相 关的文件的末尾。指示符位于文件尾则返回一个非0值,否则返回0. 5) int ferror (FILE *stream)函数检查给定的stream的文件错误,没有错误返回0,否 则返回非0. 6) int flush(FILE *stream)函数使输入缓冲区的内容被真正写入到该文件。写入成功返 回0,否则返回EOF。 7) int fgetc(FILE *stream)函数从输入流中返回当前位置的下一个字符并且给文件的位 置指示符加1. 8) int fgetpos(FILE *stream, fpos_ _t *position)函数把文件位置指示符指定的当前值存 储在position所指的对象中。position 所指的对象必须是fpos_ t类型。 9) char *gets(char *str, int num, FILE *stream)函数从stream中读取num-1个字符并将这 些字符放入str所指的字符数组。 10) FILE *fopen(const char *filename, const char *mode)丽数打开一个文件并返回与他相 关的流。 11)当访问一个以读写方式打开的文件时,不能在输入(输出)操作之后跟着执行输出 因篇幅问题不能全部显示,请点此查看更多更全内容