目录[-]


1、数据流管理类

      c++程序把输入和输出看作一个字节流,输入时,程序从输入流中提取数据,输出时,程序将字节插入到输出流中。流充当了程序与流目标之间的桥梁,类似于一条水管,一端链接在程序接口,一端链接在水库或用户家里,只不过流中传输的是字节而不是水。
      由于从内存上读取速度远远大于从硬盘上读取数据,所以在程序输入输出时采用缓冲区可以更高效的处理数据,例如输入数据时,可以一次性从硬盘上读取一个区块(多个字节)到内存缓冲区中,然后逐个从缓冲区提取数据,当到达缓冲区尾部时,再从硬盘上读取下一个区块(多个字节);输出数据时,程序可以先将文件填充到缓存取,缓存区满后,或者接收到特殊字符时,再一次性将缓存区的内容传输到硬盘上存储并清空缓存区(刷新缓冲区),以备接收新的输出使用。
      管理类和缓冲区工作有点复杂,好在cpp中的 iostream 文件中包含了一些用来实现管理流和缓冲区的类。

• streambuf类:  为缓存区提供内存;填充缓存区;访问缓存区内容;刷新缓存区以及管理缓存区;
• ios-base类:    表示流的特征,例如是否可读取,流是二进制流还是文本流等;
• ios类:          基于ios-base类,包括指向streambuf对象的指针成员;
• ostream类:   从ios类派生而来,提供输出方法;
• istream类:    从ios类派生而来,提供输入方法;
• iostream类:  基于ostream类和istream类,继承了输入与输出方法。


2、iostream类

      在程序中包含iostream类将自动创建8个流对象,四条用于窄字符流,四条用于宽字符流。
• cin/wcin:(窄/宽)标准输入流,默认关联到键盘;
• cout/wcout:(窄/宽)标准输出流,默认关联到显示器;
• cerr/wcerr:(窄/宽)标准错误输出流,默认关联到显示器;错误流没有设置缓存区,这意味着错误信息将被实时发送到屏幕上。
• clog/wclog:(窄/宽)标准错误输出流,默认关联到显示器;与cerr流不同的是log流设有缓存区。


3、cout

      cpp中输出为字节流,但是在实际程序中,数据存在比字节更大的单位,比如double,float等,因此在传输字节流时,程序希望每个字节都表示一个字符值,比如在输出 3.1415时,需要将6个字符【”3”、”.”、“1”、“4”、“1”、“5”】传输到屏幕上,因此 ostream类的主要任务就是将数值类型的值转化为可以以文本形式表示的字符流。
• << 运算符重载
<<运算符默认含义为移位操作符,在ostream类中将其重载为插入运算符,并使其可以识别CPP中所有的基本类型:unsigned char、int、double、float等。
cpp用字符串存储位置的指针来表示字符串,指针的形式可以是char数组名,显式的char指针或用括号括起的字符串。
• 拼接输出的原理

std::cout<<"hello"<<"_"<<"world";

插入运算符函数定义,引用将指向用于调用该运算符的对象,也就是cout运算符函数的返回值为调用该运算符的对象,cout<<“hello”返回的是cout对象,利用这种特性即可实现输入,输出的链接。
• cout.put(char)
该方法用于显示字符,例如以下示例将输出 hi。

cout.put('h').put('i');

在原型合适的情况下,也可以将数值型参数用于put()方法,例如

cout.put(66)//将输出ASCII码为66的字符 B
cout.put(67.123)//将输出ASCII码为67的字符 C

• cout.write(字符串地址,字符串字符个数)
该方法严格遵循首地址+字符串个数的方式输出,遇到空字符也不会自动停止打印。

const char* name = "shawn"
cout.write(name,std::strlen(name))
cout.write()方法也可以用于数值数据,并且这也为将数值数据存储在文件中提供了一种很好的方式。
long value = 1234567;
cout.write((char*) &value,sizeof(long))

该方法将long数值对应的四个字节中的存储位作为独立的字节传输至输出流中。
• flush/endl
刷新缓存区,在输出中,如果不希望在填充满缓存区时再发生数据,清空缓存区的话可以用 flush()或endl()函数来强制刷新缓存区;
以下两行指令具有相同的功效。

std::cout<<"hello world"<<std::endl;
std::cout<<"hello world"<<std::flush;

• 采用cout进行格式化输出

### 控制整数以十进制,十六进制还是八进制显示
int x = 11;
cout<<hex;//等价于hex(cout)
cout<<x<<endl;//输出ob
cout<<dec;
cout<<x<<endl;//输出11
cout<<oct;
cout<<x<<endl;//输出13

• 调整字符宽度

在存储文件中,为便于数据读取,往往设置相同的字符宽度,因此可以使用width()函数将长度不同的数字存储到宽度相同的字段中。
cout<<"h";
cout.width(10);
cout<<"i";

该方法将输出 h - - - - - - - - - i,其中i占用10个字符位,不足的用空格补齐。但需要注意的是cout. width()方法只在下一次输出中起作用,然后将恢复为默认值,因此此方法需要在每次输出时调用一次。
• 调整右对齐/左对齐

cout.setf(ios::left)//调整为左对齐
cout.setf(ios::right)//调整为右对齐
cout.setf(ios::internal)//调整为符号前缀左对齐,值右对齐

• 修改填充方法
cpp在定长度输出中,默认的不足部分以空格填充,使用fill()方法可以修改默认的填充字段,以下指令将默认的填充字段设置为“\*”。
cout.fill("*")//
• 修改浮点数显示精度
cpp中默认的浮点数显示精度为6位,在此将小数点后的显示精度进行设置。
在定点模式以及科学计数模式下,精度是指小数点后面的位数。

cout.setf(ios::scientific,ios::floatfield);//ios::scientific指出设置为科学计数法模式
cout.setf(ios::fixed,ios::floatfield);//ios::fixed指出设置为定点模式
cout << setprecision(4);
cout<<3.1415926<<endl;//输出值为 3.1416

• 打印末尾的0以及小数点

cout.setf(ios_base::showpoint);
cout.setf(ios::fixed,ios::floatfield);//设置为定点模式
cout << setprecision(4);
cout<<3.14<<endl;//输出值为 3.1400

• setf() 格式选项

setf(\*\*)中设置的常量为在ios\_base基础类下定义的,因此使用时需要加上作用域解析运算符。
cout.setf(ios_base::boolalpha) //输入和输出bool值,可以为true或false
cout.setf(ios_base::showbase) //输出带基数前缀,比如16进制为0x。
cout.setf(ios_base::showpoint) //如上所例,显示末尾的小数点及0。
cout.setf(ios_base::uppercase) //对于16进制,使用大写字母表示。
cout.setf(ios_base::showpos) //输出正数时,在前加上+加号。

4、cin

• 单字符输入

cin.get()//读取下一个字符,不管是否为空格,回车,或制表符。
cin>>ch//该读取会跳过特殊字符:起始位的空格,回车,或制表符。

如果希望跳过起始位的空格 则使用cin>>更为方便。
• 字符串输入

cin.get()与cin.getline()区别在于cin.get()会将
char map[100];
cin.get(map,100)//该函数在到达第99个字符或遇到换行符时停止将输入读取到数组中
cin.getline(map,100)//该函数在到达第99个字符或遇到换行符时停止将输入读取到数组中