第9章 C++语言的输入输出流库_第1页
第9章 C++语言的输入输出流库_第2页
第9章 C++语言的输入输出流库_第3页
第9章 C++语言的输入输出流库_第4页
第9章 C++语言的输入输出流库_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9章C++语言的I/O流库王雪晶9.1屏幕输出9.2键盘输入9.3格式化输入和输出9.4磁盘文件的输入和输出内容数据的传送被看成像流水一样,从一处流向另一处,数据的传递被称为数据流。数据流中流动的字节序列。数据流按其流向可分为:输入流指的是字节流从输入设备流向内存。输出流指的是字节流从内存流向输出设备。输入流和输出流都是带有内存缓冲区的,用来存放流中的数据。流是与内存缓冲区相对应的。第9章C++语言的I/O流第9章C++语言的I/O流数据流分类:对系统指定的标准设备的输入和输出。以外存磁盘文件为对象进行输入和输出。对内存中指定的空间进行输入和输出。重要的输入流类:istream

ifstreamistrstream重要的输出流类:ostreamofstreamostrstream1.通用I/O流类库

使用这些功能时应包含头文件iostream.h。iosistreamostreamiostream提供流状态设置功能提供从输入流提取数据的操作第9章C++语言的I/O流2.文件I/O流类库使用有关文件读写操作时,应包含fstream.h文件。iosistreamostreamiostreamfstreambaseifstreamofstreamfstreamC++的I/O对C的发展——类型安全和可扩展性在C语言中,用printf和scanf进行输入输出,往往不能保证所输入输出的数据是可靠的、安全的。在C++的输入输出中,编译系统对数据类型进行严格的检查,凡是类型不正确的数据都不可能通过编译。因此C++的I/O操作是类型安全的。C++的I/O操作是可扩展的,不仅可以用来输入输出标准类型的数据,也可以用于用户自定义类型的数据。在iostream头文件定义了4种流对象cin是istream类的对象,用来处理标准输入,即键盘输入。cout是ostream类的对象,用来处理标准输出,即屏幕输出。Cerr是ostream类的对象,用来处理标准错误信息,没有缓冲,发送给它的内容立即被输出。

clog是ostream类的对象,用来处理输出信息,它提供打印机输出。第9章C++语言的I/O流9.1.1使用预定义的插入符

这是一种最简单的,也是最常用的方式。格式如下:

cout<<<表达式>“<<”在iostream头文件中对它们进行了重载。如ostreamoperator<<(int);ostreamoperator<<(float);ostreamoperator<<(char);ostreamoperator<<(char*);9.1

屏幕输出例分析下列程序的输出结果。程序内容如下:

#include<iostream.h>#include<string.h>voidmain(){cout<<"Thisisastring."<<endl;cout<<strlen("Thisisastring.")<<endl;}例分析下列程序的输出结果。

#include<iostream.h>voidfun(int,int);voidmain(){fun(20,0);fun(205,5);}voidfun(inti,intj){if(j==0)cerr<<"zeroencountered.\n";elsecout<<i/j<<endl;}把一个字符写到输出流中。如:cout.put(′a′);参数可以是字符或ASCII码

cout.put(65+32);连续调用put函数cout.put(71).put(79).put(79).put(68).put(′\n′);GOOD9.1.2使用成员函数put()输出一个字符例分析下列程序的输出结果。

#include<iostream.h>voidmain(){cout<<'H'<<'E'<<'L'<<'L'<<'O'<<endl;cout.put('H').put('E').put('L').put('L').put('O').put('\n');charc1='A',c2='B';inta=65;cout.put(c1).put(c2)<<endl;cout.put(char(a)).put(char(66))<<endl;}格式如下:

cout.write(constchar*str,intn)#include<iostream.h>#include<string.h>voidprint(char*s){cout.write(s,strlen(s)).put('\n');cout.write(s,6)<<endl;}voidmain(){char*str="IloveChina.";cout<<"Thestringis"<<str<<endl;print(str);}9.1.3使用成员函数write()输出一个字符串9.2.1使用预定义的提取符格式如下:

cin>><变量名>从键盘上输入数据是带缓冲区的,输入完数据按回车键时才形成输入流。输入流中数据项的默认分隔符为空格、tab键、换行符等空白符。9.2

键盘输入例分析下列程序的输出结果。

#include<iostream.h>voidmain(){inti,j;cout<<"Enterij:";cin>>i>>j;cout<<cin<<endl;cout<<i<<','<<j<<endl;}例使用提取符从键盘上获取整数,判断该数是大于0、小于0还是等于0,当输入非整数时退出程序。

#include<iostream.h>voidmain(){intn;cout<<"Enterainteger:";while(cin>>n){if(n>0)cout<<"n>0\n";elseif(n<0)cout<<"n<0\n";elsecout<<"n=0\n";}cout<<"nointeger!\n";}格式如下:

charistream::get() #include<iostream.h>voidmain(){charch;cout<<"Entercharactors:";while(ch=cin.get())!=EOFcout.put(ch);}9.2.2使用成员函数get()获取一个字符

格式如下:

cin.getline(char*buf,intn,chardeline='\n')9.2.3使用成员函数getline()读取一行字符例分析下列程序的输出结果,该程序中使用了getline()函数。

#include<iostream.h>voidmain(){charbuf[80];intlcnt(0),lmax(-1);cout<<"Enter…:\n";while(cin.getline(buf,80)){intcount=cin.gcount();//返回getline实际上读入的字符个数

lcnt++;if(count>lmax)lmax=count;cout<<"Line#"<<lcnt<<':'<<count<<endl;cout.write(buf,count).put('\n').put('\n');}cout<<"Largestline:"<<lmax<<endl;cout<<"Totalline:"<<lcnt<<endl;}格式如下:

cin.read(char*buf,intn)#include<iostream.h>voidmain(){charbuf[80]="";cout<<"Enter…:\n";cin.read(buf,80);cout<<buf<<endl;}9.2.4使用成员函数read()读取若干字符使用流对象的成员函数使用操作子的方法C++共有15个输入输出格式标记位,这15个标记位均为bit位,每个标记位都有自己的含义,且可以单独设置。格式标记位的取值为0或1:0表示关闭,1表示开启。9.3格式化输入和输出9.3.1使用成员函数设置流的格式化标志位标记位含义boolalpha如开启,则输入和输出使用bool值(即Ture或Falseshowbase如开启,则对于输出,使用C++基数前缀(0,0x)showpoint如开启,则显示末尾的小数点uppercase如开启,则对于16进制,使用大写字母;对于10进制,使用E表示法showpos

如开启,则在正数前面加上+

1.控制输入/输出格式的标志位1.控制输入/输出格式的标志位标记位含义dec如开启,则使用基数10(进行输出)oct如开启,则使用基数8hex如开启,则使用基数16fixed如开启,则使用定点计数法scientific如开启,则使用科学计数法left如开启,则使用左对齐right如开启,则使用右对齐internal如开启,则符号或基数前缀左对齐,值右对齐1.控制输入/输出格式的标志位标记位含义skipws如开启,则跳过输入流中的空白字符unitbuf如开启,则每次输出操作后都会清空缓冲区uppercaseunitbuf

skipwsshowposshowpoint

showbase

scientificrightoctleftinternalhexfixeddecboolalpha001000000000010维护标志字的成员函数:longflags()该函数返回当前标志字。

longflag(long)该函数使用参数更新标志字,返回更新前的标志字。

longsetf(longsetbits,longfield)将field所指定的标志位清零,将setbits所指的标志位置1,并返回设置前的标志字。

2.使用成员函数设置标志位longsetf(long)该函数用来设置参数的指定的那些标志位,并返回更新前的标志字。

longunsetf(long)该函数用来清除参数所指定的那些标志位,并返回更新前的标志字。在IOS类中,定义了:staticconstlongbasefield其值为dec|oct|hexstaticconstlongajustfield其值为left|right|internalstaticconstlongfloatfield其值为scientific|fixed2.使用成员函数设置标志位2.使用成员函数设置标志位#include<iostream>usingnamespacestd;voidmain(){cout.setf(ios::oct,ios::basefield);cout<<“OCT:48”<<48<<endl;cout.setf(ios::dec,ios::basefield);cout<<“DEC:48”<<48<<endl;cout.setf(ios::hex,ios::basefield);cout<<“HEX:48”<<48<<endl;cout.setf(ios::showbase);cout<<“HEX:48”<<48<<endl;cout.setf(ios::uppercase);cout<<“HEX:254”<<254<<endl;}1)设置输出数据所占宽度的成员函数

intwidth()该函数用来返回当前输出的数据宽度。

intwidth(int)该函数用来用设置当前输出的数据宽度,并返回更新前的宽度值。2)设置填充符的成员函数

charfill()该函数用来返回当前所用的填充符。

charfill(char)该函数用来设置当前的填充符,并返回更新前的填充符。9.3.2格式输出函数3)设置浮点数输出精度的成员函数

intprecision()该函数用来返回当前浮点数的有效数字的个数。

intprecision(int)该函数用来设置当前浮点数输出时有效数字个数,并返回更新前的值。9.3.2格式输出函数

下面给出在默认情况下的某些参数的值:①数据输出宽度默认情况下为实际宽度;②默认情况下填空符为空格符;③单精度浮点数最多提供7位有效数字,双精度浮点数最多提供15位有效数字,长双精度浮点数最多提供19位有效数字。9.3.2格式输出函数

#include<iostream.h>voidmain(){cout<<"12345678901234567890"<<endl;inti=12345;cout<<i<<endl;cout.width(10);cout<<i<<endl;cout.width(10);cout.fill('*');cout.setf(ios::left,ios::adjustfield);cout<<i<<endl;cout.setf(ios::right,ios::adjustfield);cout.precision(6);doubled=123.456789;cout<<d<<endl;cout.setf(ios::scientific,ios::floatfield);cout<<d<<endl;cout<<"width:"<<cout.width()<<endl;}使用操作子时需包含iomanip.h头文件。操作子可以直接被插入符、提取符操作。9.3.3操作子流类库所定义的操作子操作子名含义输入/输出dec数值数据采用十进制表示I/Ohex数值数据采用十六进制表示I/Ooct数值数据采用八进制表示I/Osetbase(intn)设置数制转换基数为n(n为0,8,10,16)0表示使用默认基数I/Ows提取空白符I流类库所定义的操作子操作子名含义输入/输出ends插入空字符Oflush刷新与流相关联的缓冲区Oresetiosflags(long)清除参数所指定的标志位I/Osetiosflags(long)设置参数所指定的标志位I/Osetfill(int)设置填充字符Osetprecision(int)设置浮点数输出的有效数字个数Osetw(int)设置输出数据项的域宽O

#include<iostream.h>#include<iomanip.h>voidmain(){cout<<"12345678901234567890"<<endl;inti=12345;cout<<i<<endl;cout<<setw(10)<<i<<endl;cout<<resetiosflags(ios::right)<<setiosflags(ios::left)<<setfill('*')<<setw(10)<<i<<endl;doubled=123.456789;cout<<setfill('')<<setprecision(6)<<setw(10)<<d<<endl;cout.setf(ios::scientific,ios::floatfield);cout<<d<<endl;cout<<"width:"<<cout.width()<<endl;}9.4磁盘文件的输入和输出文件流是指磁盘文件流。操作:打开文件读写操作关闭文件磁盘文件文本文件二进制文件随机文件1.打开文件打开文件通常分为两步:先创建流对象再使用成员函数open()打开指定的文件。创建流对象方法:创建fstream类的对象创建ifstream类或ofstream类的对象。9.4.1磁盘文件的打开和关闭操作(1)创建fstream类对象打开文件的方法方法一:先创建对象,再打开文件

格式如下:

fstream<对象名>;<对象名>.open("<文件名>",<访问方式>);1.打开文件文件访问方式常量方式名用途in以输入(读)方式打开文件out以输出(写)方式打开文件app以输出追加方式打开ate文件打开时,文件指针位于文件尾trunc如果文件存在,将其长度截断为0,并清除原有内容;如果文件不存在,则创建新文件binary以二进制方式打开文件,默认时为文本方式文件访问方式常量方式名用途nocreate打开一个已有文件,如该文件不存在,则打开失败noreplace如果文件存在,除非设置ios::ate或ios::app,否则打开操作失败ios::inlios::out以读和写的方式打开文件ios::outlios::binary以二进制写方式打开文件ios::inlios::binary以二进制读方式打开文件

方法二:创建对象和打开文件合二为一格式如下:

fstream<对象名>("<文件名>",<访问方式>);1.打开文件1.打开文件(2)创建ifstream类对象或ofstream类对象打开文件的方法方法一:先创建对象,再打开文件格式如下:

ofstream<对象名>;<对象名>.open("<文件名>");

或者

ifstream<对象名>;<对象名>.open("<文件名>");1.打开文件方法二:创建对象同时打开文件格式如下:

ofstream<对象名>("<文件名>");或者

ifstream<对象名>("<文件名>");2.关闭文件格式如下:

<对象名>.close();先打开文件,打开文件时应先创建流对象,打开文件时应指出文件名和访问方式;文件打开后才可以进行读写操作;操作完毕后还要关闭文件。9.4.2文本文件的读写操作例编程将一些字符信息写入到指定的文件中。

#include<iostream.h>#include<fstream.h>#include<stdlib.h>voidmain(){fstreamout;out.open("f1.txt",ios::out);if(!out){cerr<<"f1.txtcan'topen.\n";abort();}out<<"thisisastring.\n";out<<"thisisaprogram.\n";out<<"ok!\n";out.close();}例编程从一个文本文件中读出的存放的信息。

#include<iostream.h>#include<fstream.h>#include<stdlib.h>voidmain(){fstreamin;in.open("f1.txt",ios::in);if(!in){cerr<<"f1.txtcan'topen.\n";abort();}chars[80];while(!in.eof()){in.getline(s,sizeof(s));cout<<s<<endl;}in.close();}例编程将一个文件的内容复制到另一个文件中。

#include<iostream.h>#include<fstream.h>#include<stdlib.h>voidmain(){fstreaminfile,outfile;infile.open("f2.txt",ios::in);if(!infile){cerr<<"f2.txtcan'topen.\n";abort();}outfile.open("f3.txt",ios::out);if(!outfile){cerr<<"f3.txtcan'topen.\n";abort();}charch;while(infile.get(ch))outfile.put(ch);infile.close();outfile.close();}二进制文件的读写操作与文本文件的读写操作基本相同;区别在于二进制文件来说打开时需要加上ios::binary方式。用于二进制文件读写函数通常使用read()函数和write()函数。9.4.3二进制文件的读写操作例分析下列程序的输出结果,熟悉二进制文件的使用方法。

#include<iostream.h>#include<fstream.h>#include<stdlib.h>structperson{charname[20];doubleheight;unsignedshortage;};personpeople[5]={"Li",1.88,35, "Hu",1.91,25, "Gao",1.75,33, "Mao",1.72,32,

"Lu",1.69,50};

voidmain(){fstreamfile;file.open("f5.dat",ios::in|ios::out|ios::binary);if(!file){cerr<<"f5.datcan'topen.\n";abort();}for(inti(0);i<5;i++)file.write((char*)&people[i],sizeof(people[i]));file.seekp(0,ios::beg);for(i=0;i<5;i++){file.read((char*)&people[i],sizeof(people[i]));cout<<people[i].name<<'\t'<<people[i].height

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论