C++ Primer Plus 之 输入、输出和文件

来源:互联网 发布:c语言函数头 编辑:程序博客网 时间:2024/06/07 20:27

一 、流、缓冲区和iostream文件

c++将输入和输出看作字节流。输入时,程序从输入流中抽取字节;输出时,程序将字节插入输出流。通过使用缓存区可以更高效地处理输入输出。缓冲区是用作中介的内存块,它是将信息从设备输到程序或从程序输给设备的临时存储工具。通常,像磁盘驱动器这样的设备以512字节(或更多)的块为单位来传输数据,而程序通常每次只能处理一个字节的信息。缓冲区帮助匹配这两种不同的信息传输速率。从磁盘文件中读取每一个字节需要大量的硬件活动,速度非常慢。缓冲方法则从磁盘中读取大量的信息存储在缓冲区里,然后再从缓冲区里读取一个字节。因为从内存中读取单个字节的速度比从硬盘里读取快很多,所以这种方法更快也更方便。当然达到缓冲区尾部后,程序将从磁盘里读取另一块数据。输出时,程序首先填满缓冲区,然后把整块缓冲区传输给硬盘,并清空缓冲区,以供下一批输出使用。这个过程称为刷新缓冲区(flush the buffer)。键盘输入每次提供一个字符,这种情况下程序无需缓冲区来匹配不同的数据传输速率。但是,对键盘输入进行缓冲能让用户在将输入传输给程序前返回并修改。c++通常在用户按下回车键时刷新输入缓存区。
  • streambuf类为缓冲区提供内存,并提供用于填充缓冲区、访问缓冲区、刷新缓冲区和管理缓冲区内存的类方法。
  • iso_base类表示流的一般方法,如是否可读取、是二进制流还是文本流等。
  • iso类基于iso_base类,其中包括类一个指向streambuf对象的指针成员。
  • ostream类派生自iso类,提供输出方法。
  • istream类派生自iso类,提供输入方法。
  • iostream基于ostream和istream,因此继承类输入输出方法。
要使用这些工具,需使用适当的类对象,创建这样的对象将打开一个流,自动创建缓冲区,并将其与流关联起来,同时使得能使用类成员函数
包含iostream头文件将自动创建8个流对象,4个用于窄字符流,4个用于宽字符流。
  • cin对象对应标准输入流,默认关联到键盘。wcin类似,但处理的是wchar_t类型。
  • cout对象对应标准输出流,默认关联到显示器。wcout类似,但处理的是wchar_t类型。
  • cerr对象对应标准错误流,用于显示错误信息。默认关联到显示器。该流没有被缓冲,意味着将被直接发送到屏幕,而不会等到缓冲区填满或新的换行符。wcerr类似,但处理的是wchar_t类型。
  • clog对应标准错误流,默认关联到显示器,该流被缓冲。wclog类似,但处理的是wchar_t类型。
重定向不影响cerr和clog,影响cin和cout。输入重定向<,输出重定向>。Linux中也支持对标准错误流的重定向2>

二、 cout输出

2.1 重载的<<运算符

<<称为插入运算符,被重载后能识别c++中所有的基本数据类型其典型原型如下:
ostream & operator<<(int)

还能识别下面的指针类型
  • const signed char *;
  • const unsigned char*;
  • const char *;
  • const void*
c++用指向字符串存储位置的指针来表示字符串,指针的形式可以是char数组名、显示的char指针和用引号括起来的字符串。对于其他类型的指针,c++将其对应于void*,并打印地址的数值表示。
从ostream & operator<<(type)可以看出,<<函数返回的指向调用该运算符的对象的引用。因此可以通过插入运算符来连接输出。

2.2 刷新缓冲区

  • 发送换行符'\n';
  • c++会在输入即将发生时刷新缓冲区;
  • cout << flush; 
  • cout << endl; endl不仅刷新缓冲区还插入换行符;

2.3 格式化输出

浮点数的默认行为:浮点类型被显示为6位,末尾的0不显示(注意,显示的数字位数和数字被存储时的精度没有任何关系)。数字当指数大于等于6或小于等于-5时,用科学计数法表示

2.3.1 进制

  • std::dec 十进制
  • std::oct 八进制
  • std::hex 十六进制

2.3.2 头文件<iomanip>

  • setw() 设置字段宽度,只影响下一个项目。
  • setfill() 填充字段,一直有效,直到更改为止。
  • setprecision() 设置精度,一直有效,直到更改为止。

三、 cin输入

>>称为抽取运算符, 能识别c++所有的基本数据类型,其典型原型如下:
istream &operator >> (int &) //参数和返回值都是引用,使得输入能够拼接起来

还能识别下面的指针类型
  • const signed char *;
  • const unsigned char*;
  • const char *;
  • const void*

3.1 cin>>检查输入

>>查看输入流时,跳过空白符(空格、制表符、换行符),直到遇到非空白符。也就是说它读取非空白符开始,到与目标类型不匹配的第一个字符之间的全部内容。例如:
       string name;int age;char sex;cin >> name >> age >> sex;cout << "name is : " << name << endl;cout << "age is : " << age << endl;cout << "sex is : " << sex << endl;//cin: tom 18m//name is :tom//age is :18 //18m与int行的age不匹配,故只读到18,剩下的被sex读取。如果输入的是abc,则不会修改age值,>>返回0.用于if或while判断//sex is :m

3.2 流状态

cin和cout对象包含描述流状态的数据成员。流状态(被定义为iostate类型,而iostate是一种bitmask,即位掩码)由三个元素组成:eofbit,badbit和failbit,其中每个元素都是一位,取值1(设置)或0(清除)。
template<class _Dummy>const typename _Iosb<_Dummy>::_Iostate _Iosb<_Dummy>::goodbit;template<class _Dummy>const typename _Iosb<_Dummy>::_Iostate _Iosb<_Dummy>::eofbit;template<class _Dummy>const typename _Iosb<_Dummy>::_Iostate _Iosb<_Dummy>::failbit;template<class _Dummy>const typename _Iosb<_Dummy>::_Iostate _Iosb<_Dummy>::badbit;


0 0
原创粉丝点击