赞
踩
多数计算机语言的输入和输出是以语言本身为基础实现的,C和C++都没有将输入和输出建立在语言中,他们的关键字不包括I/O有关的内容。那么问题来了,他们是如何实现输入和输出的呢?
C语言:通过自带的标准函数库又称作标准输入输出软件包来实现(包含在头文件stdio.h中)。
C++语言:通过自带的标准类库来实现(包含在头文件iostream和fstream中)。
(1)数据的传递
流 :CPP将输入输出数据的传输看作是字节流,通过建立输入、输出流类库,使用流对象完成数据传递,类可以把流看成是水管(或者说里面的水更形象)。流与程序和文件相关联,从流对象中取数据称为提取,向流对象中放数据称为插入。
数据的来源位置有:文件、程序、键盘(也是文件)。
数据的去向位置有:文件、程序、显示器和打印机(也是文件)。
《图示》
Tips: 实际上,文件输出流对象 一端连接内存程序,另一端只用到与文件关联,如果需要与显示器关联则使用cout,需要与本程序其他变量关联,直接赋值就可以。关联方法Open(“参数”)的参数目前只知道是文件名字。文件输入流一端关联程序,另一端同上也只是用到文件。
数据在来源位置和去向位置间的传输需要借助流来完成,流是传输的桥梁。输入(输出类似)的管理都包括两个过程:1-将流(看成是水管)的一端与内存程序连接。2-将流的另一端与文件(磁盘文件或键盘)或其他程序连接。CPP程序仅检查字节流,不关心其来去向,因此可以使用相同的方式方法处理来自文件或者键盘的数据。
(2)数据的缓冲
缓冲的目的:匹配不同的信息传输速率,提高效率
程序每次只能处理一个字节的信息,而磁盘通常以512或更多的块为单位传输信息,所以数据传递时,通常是在内存开辟一段缓冲区,从磁盘向缓冲区传输较多数据,程序再逐一和缓冲区之间进行传输。这样不仅解决了传输速率不一致的问题,更提高了传输效率,因为程序每次从外部磁盘读取数据会有较多的硬件活动,开销较大。
管理流和缓冲区比较复杂,CPP的流类库包含了一些专门实现、管理流和缓冲区的类,这样很多实现不需要使用者处理,简化流对象的使用。流类库中部分类间继承关系如下图:
Istream、ostream、iostream是标准输入输出设备有关的输入流类,输出流类和输入输出流类,Ifstream、ofstream、fstream类是文件有关的流类,图中箭头表示向下派生,iostream类继承了istream和ostream的类方法,fstream又继承了iostream类方法,且同时包含了ifstream和ofstream中的函数方法。因此,头文件中只需要#intclude,或者#include即可,同时注意,文件流对象可以使用标准IO流对象的输入输出方法。
以下是部分类的功能:
Streambuf类:为缓冲区提供内存,提供用于填充缓冲区、访问缓冲区、刷新缓冲区和管理缓冲区内存的类方法。Tips;建立流对象时自动创建缓冲区并与流关联起来,不需要我们处理。
Ios_base类:表示流的一般特征,包括是否可以读是二进制还是文本流等。
Ios类:基于ios_base类,其中包括一个指向streambuf对象的指针成员。
要实现数据在内存和文件之间流动,(1)首先要建立流对象这个桥梁,(2)再将流对象的“两端”分别与文件和程序关联起来,(3)随后便可以使用流对象对应的类成员函数(包括哪些呢,后文介绍)进行数据处理了。
使用标准输入和输出不需步骤(1)和步骤(2),程序include后将自动创建8个流对象cin、cout、cerr、clog(4个用于窄字符流,4个用于宽字符流)。Cin的数据来源位置自动与键盘关联,去向位置就是程序。Cout的数据去向位置自动和显示器关联,来源位置与程序关联。
使用文件输入输出时,步骤ÿ
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。