1、 C C语言输入输出系统的缺陷语言输入输出系统的缺陷 C+C+输入输出流输入输出流 C+C+输入输出流类库输入输出流类库 I/OI/O格式控制格式控制 文件操作文件操作 printf()与与scanf()只可用于输入输出基本数据只可用于输入输出基本数据类型。类型。C+可通过重载运算符可通过重载运算符“”和和“”对结构对结构类型实现输入和类型实现输入和 输出。输出。当输入输出数据与预设格式不匹配时,当输入输出数据与预设格式不匹配时,C编编译系统不能发现问题,以保证其调用的正译系统不能发现问题,以保证其调用的正确性。确性。例例int j=10;float f=2.3void fn()printf(
2、“%d”,f);/按整型数据解码方式输出按整型数据解码方式输出f /前两个字节的内容前两个字节的内容 scanf(“%d”,&f);/按整型数据编码方式将数据存入按整型数据编码方式将数据存入f /前两个字节中前两个字节中 scanf(“%d”,j);/将一个整数存入地址为将一个整数存入地址为0 x000A /的内存段中的内存段中 printf(“%d”,“good”);/输出输出“good”的地址值的地址值 流流(stream):主机与外部设备介质间的数据流。:主机与外部设备介质间的数据流。标准标准I/O流的设备名:流的设备名:C+名字名字设备设备C中的名字中的名字默认值默认值cin键盘键盘s
3、tdin标准输入标准输入 cout屏幕屏幕 stdout标准输出标准输出 cerr屏幕屏幕 stderr标准错误输出标准错误输出(非缓冲方式)(非缓冲方式)clog打印机打印机 stdprn标准错误输出标准错误输出(缓冲方式)(缓冲方式)streambuf 类:提供对缓冲区的低级操作,设置缓类:提供对缓冲区的低级操作,设置缓冲区、操作缓冲区指针、向缓冲区存取字符。冲区、操作缓冲区指针、向缓冲区存取字符。streambuf 类及其派生类:类及其派生类:streambuffilebufstrstreambufconbuf ios 类:提供对文件和设备的类:提供对文件和设备的I/O操作。操作。ios
4、流类及其派生类均带有指向流类及其派生类均带有指向streambuf类的指针。类的指针。ios流类的直接派生类:流类的直接派生类:istream(标准输入流类标准输入流类)ostream(标准输出流类标准输出流类)fstreambase(文件流类文件流类)strstreambase(串流类串流类)标准输出类(标准输出类(ostream):提供系统标准输出):提供系统标准输出设备接口,完成数据输出操作。设备接口,完成数据输出操作。标准输入类(标准输入类(istream):提供系统标准输入):提供系统标准输入设备接口,完成数据输入操作。设备接口,完成数据输入操作。使用标准输入输出类需包含头文件使用标
5、准输入输出类需包含头文件“istream.h”、“ostream.h”或或“iostream.h”。例例1 例例2 cin在头文件中被定义为在头文件中被定义为istream类的全局对象。类的全局对象。cout、cerr和和clog为为ostream类的全局对象。类的全局对象。/example7-1#include main()coutThis is a test!endl;return 0;This is a test!/example7-2#include#includemain()char*p=new char20;coutp;coutp=pendl;return 0;please inp
6、ut a string:computerp=computer 用流对象的成员函数控制数据输入输出格式。用流对象的成员函数控制数据输入输出格式。例例1 1 例例2 2函数原型函数原型功功 能能 int ios:width(int w);设置输出域宽设置输出域宽w,缺省值为,缺省值为0 int ios:width();返回当前域宽值返回当前域宽值 int ios:precision(int p);设置有效数个数设置有效数个数p int ios:precision();返回当前有效数设置值返回当前有效数设置值 char ios:fill(char ch);设置填充字符设置填充字符ch,缺省值为空格,
7、缺省值为空格 char ios:fill();返回当前填充字符返回当前填充字符 输出格式控制符:头文件输出格式控制符:头文件iomanip.h(包含(包含iostream.h)中定义,可直接插入流中,控制输)中定义,可直接插入流中,控制输出格式。出格式。例例3 例例4控制符控制符流成员函数流成员函数功能功能 dec flags(10)置基数为置基数为10 hex flags(16)置基数为置基数为16 oct flags(8)置基数为置基数为8 setfill(c)flags(c)设填充字符为设填充字符为c setprecision(n)precision(n)设输出有效数个数设输出有效数个数
8、 setw(n)width(n)设输出域宽为设输出域宽为n/example7-3#includemain()for(int i=1;i8;i+)cout.fill();cout.width(i);cout;cout.fill(m);cout.width(15-2*i);coutmendl;return 0;mmmmmmmmmmmmm mmmmmmmmmmm mmmmmmmmm mmmmmmm mmmmm mmm m/example7-4#includevoid main()double f=12.34567;coutf=f;cout default precision=cout.precisi
9、on()endl;cout.precision(2);coutf=f;cout precision=cout.precision()endl;cout.precision(5);coutf=f;cout precision=cout.precision()endl;f=12.3457 default precision=6f=12 precision=2f=12.346 precision=5/example7-5#includevoid main()double f=12.34567;coutf=fendl;coutsetprecision(2)f=fendl;coutsetprecisio
10、n(5)f=fendl;f=12.3457f=12f=12.346/example7-6#includemain()for(int i=1;i8;i+)coutsetfill()setw(i)setfill(m);coutsetw(15-2*i)mendl;return 0;mmmmmmmmmmmmm mmmmmmmmmmm mmmmmmmmm mmmmmmm mmmmm mmm m 文件操作:打开、关闭、数据输入、数据文件操作:打开、关闭、数据输入、数据输出。输出。(包含头文件包含头文件fstream.h)文件流类:文件流类:文件流类文件流类基类基类功能功能 fstream iostream
11、文件输入输出文件输入输出 ifstream istream文件输入文件输入 oftream ostream文件输出文件输出 定义文件流对象定义文件流对象 文件流类文件流类 文件流对象名;文件流对象名;/建立文件流对象建立文件流对象 文件流类文件流类 文件流对象名(文件名);文件流对象名(文件名);/建立文件对象,同时打开文件建立文件对象,同时打开文件 文件流变量:建立文件流对象的检测值,文件流变量:建立文件流对象的检测值,0失败,失败,1成功成功 通过文件对象打开文件:通过文件对象打开文件:对象名对象名.open(文件名文件名,文件打开模式文件打开模式,文件保护模式文件保护模式);文件打开模式
12、:文件打开模式:标志标志含义含义 ios:ate如果文件存在,数据追加在文件尾如果文件存在,数据追加在文件尾 ios:in打开文件,读出数据(打开文件,读出数据(ifstream默认)默认)ios:out打开文件,写入数据(打开文件,写入数据(oftream默认)默认)ios:trunc打开文件,清除所有数据打开文件,清除所有数据 ios:nocreat若文件不存在,返回错误若文件不存在,返回错误 ios:noreplace若文件存在,返回错误若文件存在,返回错误 ios:binary以二进制方式打开文件以二进制方式打开文件(否则默认为文本否则默认为文本)文件保护模式:文件保护模式:例:例:f
13、stream f;f.open(“file1”,ios:out|ios:in);文件关闭:清理文件缓冲区,调用流对象成员文件关闭:清理文件缓冲区,调用流对象成员函数函数close()。例例 标志标志含义含义 filebuf:openprot兼容共享方式(默认)兼容共享方式(默认)filebuf:sh_none独占,不共享独占,不共享 filebuf:sh_read允许读共享允许读共享 filebuf:sh_write允许写共享允许写共享#include/example7-7main()ofstream fout(testfile);if(!fout)coutCannot open output file.endl;return 1;foutchinan;fout16;fout.close();ifstream fin(testfile);if(!fin)coutCannot open input file.si;couts iendl;fin.close();return 0;china 16