1、1第第7章章 输入输出流输入输出流 2目标目标 了解C+输入/输出的概念及机制 掌握C+输入/输出流操作 熟悉文件处理37.1 输入输入/输出流的概念输出流的概念 C+程序的输入/输出(I/O,Input/Output)操作,除了继续使用C语言习惯用的库函数实现外,还引入了“流(stream)”的概念。“流”就是数据流,是字符序列在主机与外部介质之间的流动,它负责在数据的产生者和使用者之间建立联系,并管理数据的流动。它具有方向性,与输入设备相联系的流,称为输入流;与输出设备相联系的流,称为输出流;与输入输出设备(如磁盘)相联系的流,称为输入输出流。47.2 标准流和流操作标准流和流操作 7.2
2、.1 基本输入基本输入/输出操作输出操作 7.2.2 输入输入/输出格式控制输出格式控制57.2.1 基本输入基本输入/输出操作输出操作1.标准流 标准流对象简称为标准流,是为用户常用的外部设备提供与内在之间的通信通道,从而对数据进行解释和传输,提供必要数据缓冲等。C+对标准流的端口连接定义了默认设置,如标准输入流cin与键盘连接,也可以重定向。67.2.1 基本输入基本输入/输出操作输出操作2.基本输入输出操作【例7.1】基本输出操作实例1。#include void main()int a=10,b=100;couta;cout+b;cout=a+bendl;程序结果:10+100=110
3、由“couta;”语句的箭头方向,可以清楚地看到数据从变量a流到屏幕(cout)的。由“cout+b;cout=a+bendl;”两条语句可见,使用“”将多个要输出的数据串联起来,完成多个数据的依次输出。77.2.1 基本输入基本输入/输出操作输出操作2.基本输出操作【例7.2】基本输出操作实例2。#include iostream.hvoid main()int a=7;coutaa+aa”实现数据输入功能,用键盘输入空格、Tab键和回车来表示一次输入结束。【例7.5】基本输入操作实例1。#include void main()int a;float b;char c;char str20;
4、coutabcstr;107.2.1 基本输入基本输入/输出操作输出操作cout”输出结果是:”endl;coutaendl;coutbendl;coutcendl;coutstrendl;程序结果:请输入:20 34.56 a Good!输出结果是:2034.56aGood!117.2.1 基本输入基本输入/输出操作输出操作函数功能函数功能get从流中提取字符,包括空格 seekg 移动输出流指针getline从流中提取一行字符 tellp返回输出流中指定位置的指针值read 无格式输入指定字节数operator插入运算府其它输入函数:127.2.2 输入输入/输出格式控制输出格式控制 操作
5、算子功能I/Oiostream.hdec 数值数据采用十进制表示 I/Oiostream.hhex 数值数据采用十六进制表示 I/Oiostream.hoct 数值数据采用八进制表示 I/Oiostream.hsetbase(int n)设置数制转换基数为n(0,8,10,16)0表示使用缺省基数 I/Oiostream.hendl 插入一个新行并清空流相关联的缓冲区 Oiostream.h(1)格式输出控制:137.2.2 输入输入/输出格式控制输出格式控制 操作算子功能I/Oiostream.hflush刷新与流相关联的缓冲区 Oiostream.hresetiosflags(long)清
6、除参数所指定的标志位 I/Oiostream.hsetiosflages(long)设置参数所指定的标志位 I/Oiostream.hsetfill(int)设置填充字符 Oiostream.hsetsprecision(int n)设置浮点数输出的有效数字个数(含小数点)Oiostream.h147.2.2 输入输入/输出格式控制输出格式控制 操作算子功能I/Oiostream.hsetw(int)设置输出数据项的域宽 Oiostream.hleft 左对齐,右填充字符 Oiostream.hright 右对齐,左填充字符 Oiostream.hscientific 科学记数法表示浮点值,精
7、度域指小数点后面的数字位数Oiostream.hfixed 以定点格式表示浮点值,精度域指小数点后面的数字位数 Oiostream.h157.2.2 输入输入/输出格式控制输出格式控制【例7.8】使用格式化算子进行格式输出的操作实例。#include iostream.h#include iomanip.hvoid main()int i=1024,j=256;double p=3.1415927,q=3.14;coutiendl;coutsetw(12)ijendl;couthexiendl;coutjendl;coutdecjendl;/以十进制形式输出coutsetw(10)setios
8、flags(ios:left)setfill(#)iendl;167.2.2 输入输入/输出格式控制输出格式控制/i的值占10个宽度居左输出,不足10个宽度数据后补#coutsetw(6)setfill(*)iendl;/居左输出coutpendl;/输出p值,6位有效数字coutsetprecision(5)pendl;/输出p的值,5位小数含小数点coutpendl;/输出p的值,5位小数含小数点coutresetiosflags(ios:left)setw(10)setfill($)jendl;/取消ios:left标志,输出j占10个宽度居右,数据前补$177.2.2 输入输入/输出格
9、式控制输出格式控制程序结果:1024 10242564001002561024#1024*3.141593.14163.1416$256187.2.2 输入输入/输出格式控制输出格式控制(2)通用格式控制函数:名称功能返回值int ios:width()读取当前宽度(默认值为0)当前输出宽度 int ios:width(int n)设置当前输出宽度 以前的宽度 int ios:fill()读当前的填充字符(默认值为空格)当前填充字符 int ios:fill(int n)设置填充字符 以前的填充字符 int ios:precision()读取当前的浮点数的有效数字个数(默认值为6)当前浮点数的
10、有效数字个数 int ios:precision(int n)设置浮点数精度 以前的精度值 197.2.2 输入输入/输出格式控制输出格式控制【例7.9】ios流格式操作函数的输出实例1。#include iostream.hvoid main()int i=1024;double j=13.1415927;coutiendl;cout.width(10);/设置输出宽度为10coutiendl;/输出i的值占10个宽度coutiendl;/输出i的值cout.width(10);/设置输出宽度为10cout.fill($);/设置填充字符为#cout.setf(ios:left,ios:ad
11、justfield);/设置居左coutiendl;/按当前设置输出i207.2.2 输入输入/输出格式控制输出格式控制cout.width(12);/设置输出宽度12cout.setf(ios:right,ios:adjustfield);/设置居右cout.precision(5);/设置精度为5coutjendl;/按精度设置输出j的值cout”width:”cout.width()endl;/输出当前的宽度值程序结果:1024 102410241024$13.142width:0217.3 文件处理文件处理 7.3.1 文件的打开与关闭文件的打开与关闭 7.3.2 文本文件的访问文本文
12、件的访问 7.3.3 二进制文件的访问二进制文件的访问 7.3.4 文件的随机访问文件的随机访问227.3.1 文件的打开与关闭文件的打开与关闭(1)打开文件:)打开文件:方式一:首先建立流对象,然后调用函数open连接外部文件。流类 对象名;对象名.open(文件名,方式);方式二:调用流类带参数的构造函数,建立流对象的同时连接外部文件。流类 对象名(文件名,方式);237.3.1 文件的打开与关闭文件的打开与关闭(2)文件关闭:)文件关闭:#include iostream.h#include fstream.hvoid main()ofstream outfile(d:f1.txt,io
13、s:out);if(!outfile)cerr打开文件错误!endl;elseoutfile120endl;outfile310.65endl;outfile.close();247.3.2 文本文件的访问文本文件的访问【例【例7.13】将一些信息写入】将一些信息写入d:aa.txt文本文件中。文本文件中。#include iostream.h#include fstream.hvoid main()ofstream outfile(d:aa.txt,ios:out);if(!outfile)cerr打开文件错误!打开文件错误!endl;else outfile姓名姓名t英语英语t计算机计算机
14、tendl;outfile李莉李莉t89.0t98.5tendl;outfile王晓春王晓春t85.0t87.5endl;outfile张晋张晋t76.0t67.5endl;257.3.2 文本文件的访问文本文件的访问程序执行结果,在程序执行结果,在D盘上建立了一个盘上建立了一个aa.txt文本文件,内容是:文本文件,内容是:姓名姓名英语英语计算机计算机李莉李莉8998.5王晓春王晓春8587.5张晋张晋7667.5上面程序完成向文本文件中写数据功能,还可以使用上面程序完成向文本文件中写数据功能,还可以使用getline()从文件从文件中读逐行读取数据,使用中读逐行读取数据,使用get()方法
15、从文件逐个读取字符,使用方法从文件逐个读取字符,使用put()方法向文件中逐个输出字符,并可以综合使用这些方法和循环语句方法向文件中逐个输出字符,并可以综合使用这些方法和循环语句来完成文件的复制。来完成文件的复制。267.3.3 二进制文件的访问二进制文件的访问 进行二进制文件访问时,打开文件必须加上ios:binary方式。进行读写操作时要按照数据存储格式逐个字节一一读取或写入。从二进制文件中读信息时,使用read()成员函数。向二进制文件中写入信息时,使用write()成员函数。通过下面实例说明二进制文件的读写操作。【例7.16】对一个二进制文件d:cc.dat进行读写操作。#includ
16、e iostream.h#include fstream.h#include stdlib.hvoid main()int date1=2005,03,26,date23;double x=12.45,y;277.3.3 二进制文件的访问二进制文件的访问fstream outfile(d:cc.txt,ios:out|ios:binary);/以写方式打开二进制文件if(!outfile)cerr打开文件错误!endl;abort();outfile.write(char*)date1,sizeof(date1);/将数组date1写入文件outfile.write(char*)&x,size
17、of(x);/将x写入文件outfile.close();fstream infile(d:cc.txt,ios:in|ios:binary);/以读方式打开二进制文件287.3.3 二进制文件的访问二进制文件的访问infile.read(char*)date2,sizeof(date2);/逐个字节读取文件,先读入数组date2infile.read(char*)&y,sizeof(y);/读取文件,再读入y coutdate20tdate21tdate22tyendl;infile.close();/关闭读方式打的aa.txt文件说明:在程序中通过write()函数和read()函数分别完成把数据写到cc.txt文件和从cc.txt文件读出来。在处理过程中,由于write函数只能写字符串,所以首先将其他类型的数据用“(char*)数据地址”方法转换成字符串类型,而数据的长度由sizeof()函数测定,read()函数也通过同相的方式读取二进制文件。297.3.4 文件的随机访问文件的随机访问1.文件指针相对移动函数 seekg()和seekp()2.文件指针定位函数 tellg()和tellp()3.文件指针绝对移动函数 seekg()和seekp()