和IO相关的类:
1. streambuf类为缓冲区提供了内存, 并提供了用于填充缓冲区, 访问缓冲区内容, 刷新缓冲区和管理缓冲区内存的类方法;
2. ios_base类表示流的一般特征, 如是否可读取, 是二进制流还是文本流等.
3. ios类基于ios_base, 其中包括了一个指向streambuf对象的指针成员;
4. ostream类时从ios类派生而来的, 提供了输出方法;
5. istream类也是从ios类派生而来的, 提供了输入方法;
6. iostream类时基于istream和ostream类的, 因此继承了输入和输出方法.
要使用这些工具, 必须使用适当的类对象. 例如: 使用ostream对象(如cout)来处理输出.
C++的iostream类库管理了很多细节. 例如, 在程序中包含iostream文件将自动创建8个流对象(4个用于窄字符流, 4个用于宽字符流).
cin 对象对应于标准输入流, 在默认情况下, 这个流被关联到标准输入设备(通常为键盘). wcin 对象与此类似, 但处理的是wchar_t类型.
cout 对象与标准输出流相对应. wcout对象与此类似, 但处理的是wchar_t类型
cerr 对象与标准错误流相对应, 可用于显示错误信息. 这个流没有被缓冲, 也就是信息将直接被发送给屏幕, 而不会等到缓冲区满了或者新的换行符. wcerr对象用于处理wchar_t类型.
clog 对象也对应这标准错误流, 这个流被缓冲. wclog用于处理wchar_t类型
对象代表流: 当iostream文件尾程序声明了一个cout对象时, 该对象将包含存储了与输出有关信息的数据成员, 如显示数据时使用的字段宽度, 小数位数, 显示整数时采用的计数方法以及描述用来处理输出流的缓冲区的streambuf对象的地址. 下面的语句通过指向的streambuf对象将字符串"Bjarna free"中的字符放到cout管理的缓冲区中.
cout << "Bjarne free";
cout的使用
cout重载了operator<<()函数, 并返回一个指向ostream对象的引用, 因此可以将输出链接起来:
cout << "hello " << "word." << endl;
输出和指针
ostream类还为下面的指针类型定义了插入运算符函数:
const signed char*;
const unsigned char*;
const char*;
void *;
C++用指向字符串存储位置的指针来表示字符串, 指针的形式可以使char数组名, 显示的char指针, 或用引号括起来的字符串. 看下面这个例子:
char sen[20] = "first sentence";
char * psen = "second sentence";
cout << "Hello";
cout << sen;
cout << psen;
方法使用字符串中的终止空字符来确定何时停止显示字符.
对于其他类型的指针, C++将其对应于void *, 并打印地址的数值表示. 如果要获取字符串的地址, 则必须将其强制转换为其他类型, 举个例子:
int eggs = 12;
char * amount = "dozen";
// 打印eggs变量的地址
cout << &eggs;
// 打印dozen
cout << amount;
// 打印"dozen"字符串的地址
cout << (void *)amount;
其他ostream方法:
除了各种operator<<()函数外, ostream类还提供了put()方法和write()方法, 前者用于显示字符, 后者用于显示字符串. 与<<运算符一样, 该函数也返回一个指向调用对象的引用, 因此也可以用于拼接输出:
cout.put('I').put('I');
我们还可以将数值型参数(如int)用于put(), 让函数原型自动将参数转换为正确的char值, 例如:
// A
cout.put(65);
// B
cout.put(66.3);
write()方法显示整个字符串, 其模板原型如下:
basic_ostream<chartT, traits> & write(const char_type * s, streamsize n);
write的第一个参数提供了要显示的字符串的地址, 第二个参数指出要显示多少个字符.
来看一个完整的例子:
// wirte.cpp
#include <iostream>
#include <cstring>
int main()
{
using std::cout;
using std::endl;
const char * state1 = "Florida";
const char * state2 = "Kansas";
const char * state3 = "Euphoria";
int len = std::strlen(state2);
cout << "Increasing loop index:\n";
int i;
for(i = 1; i <= len; i++)
{
cout.write(state2, i);
cout << endl;
}
cout << "Decreasing loop index:\n";
for(i = len; i > 0; i--)
cout.write(state2, i) << endl;
cout << "Exceeding string length:\n";
// 超出state2的边界了 , 但是write不会停止打印, 会继续打印直到达到指定的字符数
cout.wri