C++ Primer Plus(十七)——输入、输出和文件

1. cerr和clog对象与标准错误流对应,但cerr不被缓冲。ios

2. streambuf类为缓冲区提供了内存,并提供了用于填充缓冲区、访问缓冲区内容、刷新缓冲区和管理缓冲区内存的类方法。ios_base类表示流的通常特征(是否可读取?二进制流?等,ios类基于ios_base,包含一个指向streambuf的指针成员c++

 

3. ostream提供了put和write方法,前者用于显示字符,后者用于显示字符串。write的第一个参数提供了要显示的字符串地址,第二个指出要显示多少个字符。须要注意的是write方法并不会在遇到空字符时中止打印字符,而是打印指定数目的字符,即便超出了字符串的边界。app

4. 多数C++实现都会在输入即将发生时刷新缓冲区。若是实现并不能在但愿时刷新输出,那么可使用两个控制符中断一个强行刷新:控制符flush刷新缓冲区;控制符endl不只刷新缓冲区还插入一个换行符。事实上,控制符也是函数,能够直接调用刷新,如flush(cout)。函数

5. cout 进行格式化,浮点数的老式实现和新实现有所不一样,新实现当指数大于等于6或小于等于5时,用科学计数法表示,默认的行为对应于带%g说明符的标准C库函数fprintf。测试

6. cout如何设置显示整数时的计数系统:dec、hex和oct控制符,如hex(cout)编码

7. cout调整字符宽度:spa

int width();       // 返回字段宽度的当前设置
int width(int i);  // 将字段宽度设置为i个空格,并返回之前的字符宽度值

width方法只影响接下来显示的一个项目,而后字段宽度将恢复为默认值命令行

8. cout填充字符:在默认状况下,cout使用空格填充字段中未被使用的部分,能够用fill( )函数来改变填充字符,与字段宽度不一样的是,新的填充字符一直有效,直到更改它为止。指针

9. cout设置浮点数的显示精度:使用precision函数设置精度rest

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。

相关文章
相关标签/搜索