C++输入/输出流
一、流
低级I/O功能(如无格式的I/O):通常指大量的字节在设备到内存或内存到设备的简单传输。
高级I/O功能(格式化I/O):它将字节组合成有意义的单元,如数据类型。
对于大容量文件的处理,使用无格式的I/O可获得最佳的性能。
二、成员函数get和getline
不带参数值成员函数get ,从指定的流中读取一个字符(即使是空格),并返回该字符作为该函数的调用值。遇到文件结束时返回EOF。
get 函数还可以带3个参数:接收字符的字符型数组,数组大小和分隔符(默认
为'/n'),从输入流中读取数据时,读取到比指定的最大字符数少一个字符中止,或者读取到指定的分隔符终止。为了使字符串数组(被程序用作缓冲区)中的输入字符串结束,空字符会被插入到字符数组中。分隔符不会被存储在数组中,但仍保留在输入流中(下一个要被读取的字符),所以除非分隔符从输入流中刷新,否则紧接着的第二个get操作结果就是空行。
getline 函数的操作与带3个参数的get成员函数类似,读取一行字符串后在字符串数组中插入一个空格,不同的是getline会从输入流中删除分隔符,而不是把它放入数组。
三、ignore 用于跳过指定数量的字符(默认1)或转到指定的分隔符(默认EOF),
在读取文件该分隔符可使ignore跳到文件末尾终止输入。
putback 的作用是把上次从输入流中通过get取得的字符在放回该输入流中。对于应用
程序需要扫描输入流以查找以特定字符开头的字段来说,非常有用。
peek 的功能是返回输入流一下个字符,而不是从输入流中删除该字符。
四、成员函数read,gcount,write的无格式输入/输出
read
write 专用于处理无格式的输入/输出。它们负责把一定量的字节输入内存的数
组,以及从内存数组中输出字节(未被格式化)。
gcount 可以统计最后一次输入操作读取的字符数。
五、流操纵元
用来完成格式化I/O,诸如设置域宽,设置精度,设置和清除格式化标志,设置字段填充字符,刷新流,在输入流中插入一行并刷新流,在输出流中插入空白字符,跳过输入流的空白字符等功能。
1、 数流基数
dec oct hex setbase (如setbase(10)十进制)
十进制 八进制 十六进制 参数化流操纵元
2、 设置浮点数的精度
精度一旦设置,就可用语以后所有的输出流操作,直至精度发生变化。
cout.precision( num );
setprecision( num );
3、设置域宽:
setw
width 宽度的设置仅使用于下一行的流插入或流读取,在该次操作完成
之后,宽度就被置回0(即输出值按照所需的宽度来输出)不带参数的width函数返回当前的设置。
六、流格式装备
各种格式标志指定了即将在I/O流操作期间执行的格式类型,成员函数setf,unsetf和flags用语设置控制标志。
举例: cout.setf( iso::showpos ) 指定正负数前要加+和-号
cout.setf( iso::scientific )指定浮点数输出采用科学记数法
cout.setf( iso::left )
cout.setf( iso::right ) 左/右对齐输出
七、流错误状态
ios类中的位可用于测试流的状态
遇到文件结束符之后,将为输出流设置eofbit位。调用成员函数来确定是否已经遇到了文件结束符。
流中发生格式错误时,虽然会设置failbit,但字符不会丢失。成员函数fail判断流操作是否失败,这种错误通常可修复。
发生导致数据丢失的错误时,设置dadbit。成员函数bad判断留操作是否失败,这种严重的错误通常不可修复。
如果以上的3状态没有设置,则设置goodbit。
测试流状态较好的方法是使用成员函数eof,bad,fail,good。
clear通常用于把一个流状态恢复为"good",从而可以对该流继续执行I/O操作,由于其默认参数ios::goodbit利用语句 cin.clear()
例:cin.clear( ios::failbit )为流设置了failbit。
八、把输出流连接到输入流
成员函数tie以同步istream和ostream 的操作以保证输出在输入之前显示出来
例: cin.tie( &cout );不过这个C++会自动执行。
Inputstream.tie( 0 ) 解除从输出流到输入流的连接
文件的拷贝:(将to.txt中的内容全部复制到from.txt)
ifstream in("to.txt"); assert(in); ofstream out("from.txt"); assert(out); out << in.rdbuf() ;
strstreams介绍:
istrstream::istrstream( char* buf );
//取一个指向零终止符数组的指针;可以提取字节直到零为止。
istrstream::istrstream( char* buf, int size );
//可以一直提取字节到buf[size],而不管是否遇到了一个零。
ostrstream::ostrstream( char*, int, int = ios::out );
// char* 是预分配的缓冲区,在那里字符将结束
// int 缓冲区的大小
// int = ios::out 模式,如果缺省,字符从缓冲区的开始地址格式化。
关于ostrstream,需要记住的一点:没有为我们插入一般在字符数组末尾所需要的零终止符。当我们准备好零终止符时,用特别操纵算子ends。