输入输出流的灵活、安全、易用是使它替代C风格的输入输出函数的主要原因。
上图是输出输出流的简化类图,可以看到,各种各样的输入输出类都派生自同一个类。
输入输出流最基本的两个运算符就是插入号(inserter)<<和提取号(extractor)>>
基本用法:
cout << 目标;//输出目标,即将信息插入目标
cin >> 目标;//读取目标,即从外界提取信息
行操作函数:
成员函数get( )和getline( )
头文件<string>中定义的全局函数getline( )
流状态
badbit
产生了某种致命(可能是硬件)错误。此时不应当考虑使用该流。
eofbit
输入结束(可能是读到了流的结束位置,也可能是用户用Ctrl+Z或Ctrl+D关闭了控制台流。
failbit
输入输出操作失败,这种情况通常是数据不可用造成的(例如在试图读取数字时却读到了字符)。这样的流不可以使用。当输入结束时,也会设置failbit标志。
goodbit
一切正常,没有任何错误。输入也还没有结束。
文件流:和其他的流一样,都有<<和>>两个运算符,用法是一样的,只不过操作对象是文件。
文件流模式:
ios::in
以读取方式打开文件。使用这个模式打开文件可以防止对已有文件的误写操作。
ios::out
以写入方式打开文件。使用此标志时,如果没有同时使用ios::app、ios::ate或ios::in ,则标志ios::trunc默认是为真的。
ios::app
以追加方式打开文件(只模式下只可以向文件追加内容)。
ios::ate
打开文件并把操作指针移动到文件末尾(可以是打开文件,也可以是写入文件)
ios::trunc
如果旧文件存在,则修改旧文件。
ios::binary
以二进行模式打开一个文件。默认是文本模式。
输入输出流缓存(Iostream buffering),如上图,是为用户提供的操作二进制流内容的类。
输入输出流的内部查找方向:
ios::beg
从流的开头。
ios::cur
从当前位置。
ios::end
从流的结尾。
字符串输入输出流格式控制:
ios::skipws
忽略空格(输入时默认是开启的)
ios::showbase
这里指的是输出时显示合法值的进制前缀(比如,可以设置为十进行、八进制、十六进制等)。此标志开启时,输入流也可以辨识进制前缀。
ios::showpoint
显示浮点数的小数点及精确度(也就是小数点后面有几个零)
ios::uppercase
将十六进行中的A-F以及科学计数中的E以大写形式显示。
ios::showpos
显示正数的“+”号。
ios::unitbuf
“单位缓存”(“Unit buffering.”)。每次插入都马上清空缓存。
进行操作控制:
ios::dec
将整型数据按十进行格式化(默认进制——显示值时不带前缀)。
ios::hex
将整型数据按十六进行格式化。
ios::oct
将整型数据按八进行格式化。
ios::scientific
以科学计数方式显示浮点型数据。精确位表明小数点后精确的位数。
ios::fixed
以固定格式显示浮点型数据。精确位表明小数点后精确的位数。
“自动浮点格式”(没有设置任何浮点格式时)精确位表明所有的有效数字。
ios::left
左对齐数值,在右侧不足位填充字符。
ios::right
左对齐数值,在右侧不足位填充字符。这是默认的对齐方式。
ios::internal
在任意标志或数制符后,数值之前填入字符。
Function
Effect
int ios::width( )
返回当前宽度。默认值是零。可以用于输入与输出。
int ios::width(int n)
设置宽度,返回设置前的宽度。
int ios::fill( )
返回当前填充字符。默认是空格。
int ios::fill(int n)
设置填充字符,返回设置前的填充字符。
int ios::precision( )
返回当前浮点数精度。默认是6。
int ios::precision(int n)
设置浮点精度,返回设置前精度。
控制操作符(Manipulators),C++提供了丰富的控制操作符(带参数和不带参数的),且还可以通过如下方式自定义:
//: C04:nl.cpp
// Creating a manipulator.
#include <iostream>
using namespace std;
ostream& nl(ostream& os) {
return os << '/n';
}
int main() {
cout << "newlines" << nl << "between" << nl
<< "each" << nl << "word" << nl;
} ///:~
//: C04:Effector.cpp
// Jerry Schwarz's "effectors."
#include <cassert>
#include <limits> // For max()
#include <sstream>
#include <string>
using namespace std;
// Put out a prefix of a string:
class Fixw {
string str;
public:
Fixw(const string& s, int width) : str(s, 0, width) {}
friend ostream& operator<<(ostream& os, const Fixw& fw) {
return os << fw.str;
}
};
// Print a number in binary:
typedef unsigned long ulong;
class Bin {
ulong n;
public:
Bin(ulong nn) { n = nn; }
friend ostream& operator<<(ostream& os, const Bin& b) {
const ulong ULMAX = numeric_limits<ulong>::max();
ulong bit = ~(ULMAX >> 1); // Top bit set
while(bit) {
os << (b.n & bit ? '1' : '0');
bit >>= 1;
}
return os;
}
};
int main() {
string words = "Things that make us happy, make us wise";
for(int i = words.size(); --i >= 0;) {
ostringstream s;
s << Fixw(words, i);
assert(s.str() == words.substr(0, i));
}
ostringstream xs, ys;
xs << Bin(0xCAFEBABEUL);
assert(xs.str() ==
"1100""1010""1111""1110""1011""1010""1011""1110");
ys << Bin(0x76543210UL);
assert(ys.str() ==
"0111""0110""0101""0100""0011""0010""0001""0000");
} ///:~
宽字符,因为有些编译器不支持,不详述了,用到的自己查吧。
本地化,可以使用Locales.