1. cerr和clog对象与标准错误流对应,但cerr不被缓冲。
2. streambuf类为缓冲区提供了内存,并提供了用于填充缓冲区、访问缓冲区内容、刷新缓冲区和管理缓冲区内存的类方法。ios_base类表示流的一般特征(是否可读取?二进制流?等,ios类基于ios_base,包含一个指向streambuf的指针成员
3. ostream提供了put和write方法,前者用于显示字符,后者用于显示字符串。write的第一个参数提供了要显示的字符串地址,第二个指出要显示多少个字符。需要注意的是write方法并不会在遇到空字符时停止打印字符,而是打印指定数目的字符,即使超出了字符串的边界。
4. 多数C++实现都会在输入即将发生时刷新缓冲区。如果实现并不能在希望时刷新输出,那么可以使用两个控制符中断一个强行刷新:控制符flush刷新缓冲区;控制符endl不仅刷新缓冲区还插入一个换行符。事实上,控制符也是函数,可以直接调用刷新,如flush(cout)。
5. cout 进行格式化,浮点数的老式实现和新实现有所不同,新实现当指数大于等于6或小于等于5时,用科学计数法表示,默认的行为对应于带%g说明符的标准C库函数fprintf。
6. cout如何设置显示整数时的计数系统:dec、hex和oct控制符,如hex(cout)
7. cout调整字符宽度:
int width(); // 返回字段宽度的当前设置
int width(int i); // 将字段宽度设置为i个空格,并返回以前的字符宽度值
width方法只影响接下来显示的一个项目,然后字段宽度将恢复为默认值
8. cout填充字符:在默认情况下,cout使用空格填充字段中未被使用的部分,可以用fill( )函数来改变填充字符,与字段宽度不同的是,新的填充字符一直有效,直到更改它为止。
9. cout设置浮点数的显示精度:使用precision函数设置精度
10. cout打印末尾的0和小数点:ios_base类提供了一个setf函数可以控制多种格式化特性,这个类还定义了多个常量,可用作该函数的参数,例如使用ios_base::showpoint可以使cout显示末尾小数点,默认精度6位。
格式常量
常量 | 含义 |
---|---|
ios_base::boolalpha | 输入和输出bool值,值为true/false |
ios_base::showbase | 对于输出,使用C++基数前缀(0,0x) |
ios_base::showpoint | 显示末尾小数点默认精度为6 |
ios_base::uppercase | 对于16进制输出,使用大写字母,E表示法 |
ios_base::showpos | 在正数前面加上+,当且仅当基数为10时才使用,十六进制和八进制C++都视为无符号 |
setf有两个原型,第一个原型如下:
fmtflags setf(fmtflags);
其中fmtflags是bitmask类型的typedef名,用于存储格式标记。bitmask是一种存储各个位值的类型,他可以是整型、枚举,也可以是STL bitset容器,这里的主要思想是每一位都可以单独访问,都有自己的含义。
第二个原型如下:
fmtflags setf(fmtflags ,fmtflags);
第一个参数和第一个原型一样,第二个参数指出要清除第一个参数中的哪些位。
setf(long, long)的参数
第二个参数 | 第一个参数 | 含义 |
---|---|---|
ios_base::basefield | ios_base::dec | 使用基数10 |
ios_base::basefield | ios_base::oct | 使用基数8 |
ios_base::basefield | ios_base::hex | 使用基数16 |
ios_base::floatfield | ios_base::fixed | 使用定点计数法,相当于printf中的%f说明符 |
ios_base::floatfield | ios_base::scientific | 使用科学计数法,相当于printf中的%e说明符 |
ios_base::adjustfield | ios_base::left | 使用左对齐 |
ios_base::adjustfield | ios_base::right | 使用右对齐 |
ios_base::adjustfield | ios_base::internal | 符号或基数前缀左对齐,值右对齐 |
11. setf( )的效果可以通过unsetf( )消除,没有专门只是浮点数默认模式的标记,使用参数ios_base::floatfield调用unsetf( )都将切换到默认模式。
12. C++在头文件iomanip中提供了其他一些控制符,常用的是setprecision、setfill、setw,它们分别用来设置精度、填充字符和设置字段宽度,setprecision接受一个指定精度的整数参数,setfill控制符接受一个指定填充字符的char参数,setw控制符接受一个指定字段宽度的整数参数。
13. 流状态由3个ios_base元素组成:eofbit、badbit、failbit
成员 | 描述 |
eofbit | 如果到达文件尾,则设置为1 |
badbit | 如果流被破坏,则设置为1 |
failbit | 如果输入操作未能读取预期的字符或输出操作没有写入预期的字符,则设置为1 |
goodbit | 另一种表示0的方法 |
good( ) | 如果流可以使用,则返回true |
eof( ) | 如果eofbit被设置,则返回true |
bad( ) | 如果badbit或failbit被设置,则返回true |
rdstate( ) | 返回流状态 |
exceptions( ) | 返回一个位掩码,指出哪些标记导致异常被引发 |
exceptions(isostate ex) | 设置哪些状态将导致clear( )引发异常,默认设置为goodbit,也就是没有引发异常,运算符OR使得能够指定多位。 |
clear(iostate s) | 将流状态设置为s,其他的清除,s的默认值为0,如果(restate( )& exceptions( )) != 0,则引发异常base_ios::failure |
setstate(iostate s) | 这将设置与s中设置的位对应的流状态位,其他状态为保持不变 |
设置流状态位有一个非常重要的后果:流将对后面的输入或输出关闭,直到位被清除。如果希望程序在流状态位被设置后能够继续读取后面的输入,就必须将流状态重置为良好,这可以通过调用clear( )方法实现。但这还不足以重新设置流的状态,导致输入循环终止的不匹配输入仍留在队列中,程序必须跳过它。一种方法是,一直读取字符知道到达空白为止。isspace函数一个cctype函数,当参数是空白字符时返回true;另一个方法是,丢弃行中的剩余部分。
14. 单字符输入get(char&)和get(void):提供不跳过空白的单字符输入功能
(1)成员函数get(char& ):如果函数到达文件尾(无论是真正的还是键盘仿真的),它都不会给其参数赋值。只要存在有效输入,函数的返回一个指向用于调用它的istream得引用,这意味着可以拼接get(char&)后面的其它抽取,此时判定的结果是true,循环将继续;到达文件尾时,返回值判定为false,循环终止。
(2)成员函数get(void):返回一个int值(或者其他整型,取决于字符集和区域),这意味着他不能够抽取运算符。到达文件尾后(无论真实与否),函数都将返回EOF——头文件iostream提供的一个符号常量,这也是返回值类型是int的原因之一,因为值EOF可能不能用char类型表示
15. 字符串输入getline( )、get( )、ignore( ):
istream& get(char* ,int, char);
istream& get(char* ,int);
istream& getline(char* ,int, char);
istream& getline(char* ,int);
(1)第一个参数是用于放置输入字符串的内存单元地址,第二个参数必要读取的最大字符数大1,第三个参数指定用作分界符的字符,只有两个参数的版本将换行符用作分界符。get( )和getline( )之间的区别在于,get( )将换行符留在输入流中,而getline抽取并丢弃输入流中的换行符。igone( )函数丢弃符合条件的字符串,它接受两个参数,第一个是要读取的最大字符数,第二个是分界符,原型为为两个参数提供的默认值为1和EOF,返回类型为istream &。
(2) getline方法如果遇到文件尾则设置eofbit,如果要读取的字符是换行符则读取并丢弃,如果读取结束,但下一个字符不是换行符,则设置failbit;get(char*, int) 首先测试字符数,然后测试是否为文件尾以及下一个字符是不是换行符。如果它读取了最大数目的字符,则不设置failbit标记。可以用peek来查看下一个输入字符,如果它是换行符,这说明get已经读取了整行,否则没读完,这个方法对getline不适用,因为它读取并丢弃换行符。
16. 其他istream方法:
(1)read( )与getline( )和get( )不同,不会在输入后加上空值字符,因此不能将输入转化为字符串,它常与ostream write( )函数结合使用,来完成文件输入输出。
(2)peek( )返回输入中的下一个字符,但不抽取输入流中的字符
(3)gcount( )返回最后一个非格式化抽取方法读取的字符数,这意味着字符是由get( )、getline( )、ignore( )或read( )方法读取的,不是抽取运算符>>读取的。
(4)pushback( )将一个字符插入到输入字符串中,被插入的字符是下一条输入语句读取的第一个字符,返回类型是istream&。
17. 较新的C++实现提供了一种更好检查文件是否被打开的方法——is_open( )方法,该方法能够检测到程序正试图以不合适的文件模式打开文件导致失败以及老式方法fin.good( ) 能检测到的错误。
18. C++有一种能让在命令行环境中运行的程序能够访问命令行参数的机制,方法是使用下面的main函数:
int main(int argc, char* argv[])
argc是命令行中参数的个数,包含命令名本身;argv是一个指针,指向命令行中的字符串参数
19. 有些C++实现要求在程序末尾使用fin.clear( ),有些则不要求,这取决于将文件与ifstream对象关联起来时,是否自动充值流状态。使用fin.clear( )是无害的,即使在不必使用它的时候使用。
20. C++文件模式常量:
常量 | 含义 |
ios_base::in | 打开文件,以便读取 |
ios_base::out | 打开文件,以便写入 |
ios_base::ate | 打开文件,并移到文件尾 |
ios_base::app | 追加到文件尾 |
ios_base::trune | 如果文件存在,则截短文件 |
ios_base::binary | 二进制文件 |
21. ifstream.open( )方法和构造函数用ios_base::in(打开文件以读取)作为模式参数的默认值,而ofstream.open( )和构造函数用ios_base::out | ios_base::trunc作为默认值。
22. C++和C的文件打开模式
C++模式 | C模式 | 含义 |
ios_base::in | "r" | 打开以读取 |
ios_base::out 或者 ios_base::out | ios_base::trunc | "w" | 等价于ios_base::out | ios_base::trunc |
ios_base::out | ios_base::app | "a" | 打开以写入,只追加 |
ios_base::in | ios_base::out | "r+" | 打开以读写,在文件允许的位置写入 |
ios_base::in | ios_base::out | ios_base::trunc | "w+" | 打开以读写,如果已存在则首先截短文件 |
c++mode | ios_base::binary | "cmodeb" | 以C++mode(或相应的cmode)和二进制模式打开 |
c++mode | ios_base::ate | "cmode" | 以指定的模式打开,并移到文件尾。C使用一个独立的函数调用而不是模式编码。 |
23. fstream提供了两个在文件中移动的方式:seekg( ) 和 seekp( ),前者将输入指针移到指定的文件位置,后者将输出指针移动到指定的文件位置,实际上,由于fstream使用缓冲区来存储中间数据,因此指针指向的是缓冲区中的位置,而不是实际的文件。可以使用seekg来移到文件的开头。下面是seekg的两个原型:
basic_istream<charT, traits>& seekg(off_type, ios_base:seekdir);
basic_istream<charT, traits>& seekg(pos_type);
第一个原型:第一个参数是相对于文件特定位置的偏移量(单位为字节),第二个为文件位置特定值,它有三个可能的值:ios_base::beg(文件开始处),ios_base::cur(当前位置),ios_base::end(文件尾)。
第二个原型:参数是定位到文件中的一个位置,是文件中从文件开始处算起的绝对位置。它可以是类,但必须包含一个接受pos_type参数的构造函数和一个接受整数参数的构造函数,以便将这两种值转换为pos_type值。
24. 如果要检查文件指针的当前位置,对于输入流可以使用tellg方法,对于输出流可以使用tellp方法。
25. 创建fstream对象时,输入输出指针将一前一后地移动,因为tellg和tellp返回的值相同。然而如果使用istream对象管理输入流,使用ostream管理同一个文件的输出流,则输入输出指针框彼此独立的移动,因此tellg和tellp将返回不同的值。
26. 可以使用cstdio中声明的tmpnam生成TMP_NAM个不同的文件名,其中每个文件名包含的字符不超过L_tmpnam个。
27. iostream族支持程序和终端之间的I/O,而fstream使用相同的接口提供程序和文件之间的I/O,sstream使用相同的接口提供程序和string对象之间的I/O。
来源:oschina
链接:https://my.oschina.net/u/1398794/blog/1560717