Giskard

(七)输入输出流

2019-01-27

C++没有定义任何用于执行输入或输出的语句,但可以使用C语言中的标准I/O函数printf()和scanf()来解决此问题。

printf()与scanf()存在两个缺点:

非类型安全

不可扩充性

C++将数据从一个对象到另一个对象的流动抽象为“流”。流动的方向不同,构成输入/输出流,即I/O流。

C++编译系统提供的I/O流类库含有两个平行基类:

streambuf

ios

ios类有4个直接派生类:

输入流类istream

输出流类ostream

文件流类基类fstreambase

字符串流类基类strstreambase

iostream

iostream:I/O流类库的最主要的头文件,包含了对输入输出流进行操作所需的基本信息,还包括cin、cout、cerr和clog共4个流对象。

fstream:用于用户管理的文件的I/O操作。

strstream:用于字符串流I/O。

stdiostream:用于混合使用C和C++的I/O操作。

iomanip:使用格式化I/O时应包含此头文件。

无格式输入/输出就是按系统预定义的格式进行的输入/输出。cout,cin

ostream cout(stdout);

istream cin(stdin);

C++提供了两种格式化输入/输出方式:

一种是用流对象的有关成员函数进行格式化输入输出

另一种是用专门的控制符进行格式化输入输出

用流对象的成员函数格式化

流成员函数主要是通过对状态标志、输出宽度、填充字符以及输出精度的操作来完成输入/输出格式化。

输入/输出的格式由各种状态标志来确定,在ios类中定义为枚举量。

枚举量定义在ios类中,因此引用时必须包含ios::前缀。使用时应该全部用符号名,绝不要用数值。

用setf函数设置状态标志, 其一般格式如下:

long ios::setf(long flags)

用unsetf函数清除状态标志,其一般格式如下:

long ios::unsetf(long flags)

cout.setf(ios::showpos);

设置输出宽度函数有两种形式,其格式分别如下:

​ int ios::width(int len)

​ int ios::width()

第一种形式是设置输出宽度,并返回原来的输出宽度;第二种形式是返回当前输出宽度,默认输出宽度为0。

只对其后的第一个输出项有效。

char ios::fill(char ch)

char ios::fill()

第一种形式是重新设置填充字符,并返回设置前的填充字符;第二种形式是返回当前的填充字符。

int ios::precision(int p)

int ios::precision()

第一种形式是重新设置输出精度,并返回设置前的输出精度;第二种形式是返回当前的输出精度。默认输出精度为6 。

ostream类除了提供用于格式控制的成员函数外,还提供了专用于输出单个字符的成员函数put。

cout.put(‘a’);

cin.get()用来从指定的输入流中提取一个字符

cin.get(ch)用来从输入流中读取一个字符,赋给字符变量ch

用getline函数读入一行字符

eof函数

无参函数,表示文件结束。

while(!cin.eof())

用控制符格式化

设置输入/输出宽度setw(int)

用整型参数来制定输入/输出域的宽度。使用时只对其后一项输入/输出有效。

当用于输出时,若实际宽度小于设置宽度时,数据向右对齐,反之则按数据的实际宽度输出。

当用于输入时,若输入的数据宽度超过设置宽度时,超出的数据部分被截断而被作为下一项输入内容。

设置输出填充字符setfill(char)

与ios::fill相同,常与setw(int)联合使用,从而向不满设置输出宽度的空间填入指定的字符,不设置则填空格。

C++把文件看作是一个字符(字节)的序列,即由一个个字符(字节)顺序组成。

根据数据的组织形式,可分为ASCII码文件和二进制文件。

ASCII码文件又称为文本文件,它的每一个字节存放一个ASCII码,代表一个字符。

二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘文件存放。

56:ASCII表示为 00110101 00110110,占两字节

56:二进制表示为 111000,占六个二进制位

若在文件的打开方式中没有特别说明,打开的文件均为ASCII码文件,若要打开二进制文件,则要特别说明并用特定的读写函数。

二进制文件用binary方式打开,读写方式完全由程序控制。

Tags: C/C++