最近在准备复试,学习c++,就当作是学习笔记了
`
C++的I/O是以一连串的字节流的方式进行的。在输入操作中,字节从设备(例如,键盘、磁盘驱动器、网络连接等)流向内存。在输出操作中,字节从内存流向设备(例如,显示屏、打印机、磁盘驱动器、网络连接等)。
应用程序通过字节传达信息。字节可以组成字符、原始数据、图形图像、数字语音、数字视频或者任何应用程序所需要的其他信息。系统I/O结构应该能持续可靠地将字节从设备传输到内存,反之亦然。这种传输一般包含一些机械运动,例如,磁盘或磁带的旋转,或者键盘的敲击。数据传输所花费的时间远远大于处理器内部处理数据所花费的时间。所以I/O操作需要仔细计划和协调,以保证最优的性能。
C++同时提供“低层次的”和“高层次的”I/O功能。
低层次的I/O功能(也就是非格式化的I/O)指定字节应从设备传输到内存还是从内存传输到设备。这种传输通常针对单个字节。这种低层次的L/0提供速度快、容量大的传输,但是对程序员来说并不方便。
高层次的I/O(也就是格式化的I/O)。在这种输出方式中字节被组成了有意义的单元,例如整数、浮点数、字符、字符串和用户定义类型。除了大容量的文件处理之外,这种面向类型的方法能够满足绝大多数的I/O处理。
预定义对象cin是一个 istream实例,并且“被连接到”(或者“被绑定到”)标准输入设备,通常是键盘。在下面的语句中,流提取运算符(>>)用于使一个整型变量 grade的值(假设grade已经被声明为int变量)从cin输入到内存:
cin >> grade;
注意,由编译器确定grade的数据类型,并选择适当的流提取运算符重载。假设grade已经被正确地声明,流提取运算符不需要附加的类型信息(例如,像C语言的I/O的方式)。重载>>运算符用来输入内置类型、字符串和指针的值。
预定义对象cout是一个ostream实例,并且“被连接到”标准输出设备,通常是显示屏。在下面的语句中,使用流插人运算符(<<)将变量grade的值从内存输出到标准输出设备:
cout << grade
注意,也是由编译器确定grade的数据类型(假设grade已经被正确地声明)并且选择合适的流插入运算符,因此流插入运算符也同样不需要附加类型信息。重载<<运算符用来输出内置类型、字符串和指针的值。
预定义对象cerr是一个ostream 实例,并且“被连接到”标准错误设备。对象cerr的输出是无缓冲的。这意味着每个针对cerr的流插入的输出必须立刻显示,这对于迅速提示用户发生错误非常合适。
预定义对象clog是一个ostream 实例,并且“被连接到"标准错误设备。clog 的输出是有缓冲的。这意味着每个针对clog中的流插入的输出将保存在缓冲区中,直到缓冲区填满或是被清空才会输出。在操作系统课程上曾讨论过,使用缓冲技术可以加强I/O的性能。
ostream提供了格式化的和非格式化的输出功能。输出功能包括使用流插入运算符(<<)执行标准数据类型的输出;通过成员函数put进行字符输出;通过成员函数write进行非格式化的输出;十进制、八进制、十六进制格式的整数输出;具有不同精确度的浮点数的输出,或是具有强制小数点的浮点数的输出,以及以科学记数和定点小数格式的输出;指定宽度数据的输出;用指定符号填充数据域的输出;以及使用科学记数和十六进制符号表示的大写字母的输出。
可以使用成员函数put输出字符。例如,语句
cout.put(“A’);
显示单个字符A。put也可以级联使用。例如,语句
cout.put( ‘A’ ).put( ‘\n’ );
输出一个字母A,接着输出一个换行符。前面的语句就以像使用<<一样的方式执行,因为点运算符(.)是从左向右执行,put 成员函数给ostream对象( cout)返回一个引用,该对象接受了put的调用。也可以用代表一个ASCII值的数字表达式作为参数来调用put成员函数,例如,语句
cout.put( 65 );
的输出也是A。
三种get
没有实参的成员函数 get从指定流输入一个字符(包括空白字符及其他非图形字符,比如表示文件尾的键序列等),并将这个值作为函数调用的返回值返回。get函数在遇到流中的文件尾时返回EOF值。
带一个字符引用参数的get 函数将输入流中的下一个字符(即使它是一个空白字符)输人,并将它存诸在其引用的字符参数内。在调用这个版本的get 函数时将给调用它的istream对象返回一个引用。
get 函数拥有三个参数:一个字符数组、一个数组长度限制和一个分隔符(默认值为‘\n’)。这个函数可以从输入流读取多个字符,它可以读取“数组最大长度-1"个字符后终止,也可以遇到分隔符就终止。在程序中,插入一个空字符用来结束字符数组中的输入字符串,字符数组在程序中作为缓冲区。**分隔符没有放置在字符数组中,而是保留在输入流中(分隔符是下一个被读取的字符)。**因此,第二次 get 函数调用所得的结果将是个空行,除非将分隔符从输人流中移出(可以使用cin.ignore( ))。
成员函数getline操作与第三个版本的成员函数get类似,在该行所存储的字符数组的末尾插入一个空字符。getline函数从流中移除分隔符(也就是读取该字符然后丢弃),没有将其放在字符数组内存储。
非格式化的输入/输出使用的分别是istream与 ostream 的成员函数read和 write。成员函数read将一定数量的字节读入到字符数组中,
成员函数write则从字符数组中输出字节。这些字节没有经过任何格式化,它们就像原始字节一样输入或输出。例如,命令
char buffer[ ] =“HAPPY BIRTHDAY”;
cout.write( buffer,10);
输出 buffer数组中的前10个字符(包括空字符,任何一个空字符都会导致使用cout和<<进行输出操作的终止)。调用
cout.write(“ABCDEFGHIJKLMNOPQRSTUVWXYZ”,10);
显示字母表的前10个字母。
成员函数read将指定数量的字符读入到字符数组中。当读取的字符数量少于指定数量时,failbit将被设置
可以使用流操纵符setprecision或ios_base的成员函数 precision来控制浮点数的精度(也就是小数点右边的位数)。调用这两者之中的任何一个都可以改变输出精度,这将影响后面所有的输出操作,直到下一个设置精度操作被调用为止。调用无参数的成员函数 precision将返回当前的精度设置(这样可以在不再使用“黏性的"设置时,重新使用原来的精度设置)。
成员函数width(基类是ios_base)可以设置域宽(也就是输出值所占的字符位数或是可输入的最大字符数)并且返回原先的域宽。如果输出值的宽度比域宽小,则插入填充字符进行填充。宽度大于指定宽度的值不会被截短,会将整个值都打印出来。不含参数的width函数将返回当前域宽。
宽度设置只适用于下一次输入或输出(也就是说宽度设置并不是“黏性的”),之后的宽度被隐式地设置为0(也就是输入和输出将使用默认设置)。一次宽度设置适用于所有后续输出的假设是逻辑错误。
流操纵符left和right分别使域左对齐并在其右边填充字符,或者右对齐并在其左边填充字符。填充字符由成员函数fill或是参数化流操纵符setill指定
流操纵符internal 表示数字的符号(或是使用showbase流操纵符显示的基数)应当左对齐,同时数字的数值部分应右对齐,而中间的部分则使用填充字符填充。
成员函数fill 指定对齐域的填充字符。如果没有字符被指定,则使用空格符填充。fill函数返回设定之前的填充字符。setill操纵符也用于设置填充字符。