690 likes | 894 Views
第 11 章 C++ 语言的 I/O 流类库. 本章的最主要目的就是把对象保存到磁盘文件中并从磁盘文件重建对象。当然 C++ 可完成更多的任务。 C++ 语言中并没有输入 / 输出语句,而是在标准库里包含了一个 I/O 流类库,它与标准模板库同为 C++ 标准库中最重要的组成部分。数据从一个对象到另一个对象的传送被抽象为“流”。数据的输入 / 输出就是通过输入 / 输出流来实现的。 流是一种抽象的概念,负责在数据的产生者和数据的使用者之间建立联系,并管理数据的流动。. 第 11 章 C++ 语言的 I/O 流类库. 11.1 I/O 流类库的功能.
E N D
第11章 C++语言的I/O流类库 本章的最主要目的就是把对象保存到磁盘文件中并从磁盘文件重建对象。当然C++可完成更多的任务。 C++语言中并没有输入/输出语句,而是在标准库里包含了一个I/O流类库,它与标准模板库同为C++标准库中最重要的组成部分。数据从一个对象到另一个对象的传送被抽象为“流”。数据的输入/输出就是通过输入/输出流来实现的。 流是一种抽象的概念,负责在数据的产生者和数据的使用者之间建立联系,并管理数据的流动。
第11章 C++语言的I/O流类库 11.1 I/O流类库的功能 11.5 磁盘文件的输入 和输出操作 11.2 常用的读写操作 11.6 字符串流操作 11.3 格式化输入输出 操作 11.7 流错误处理 11.4 插入符和提取符 的重载
11.1 I/O流类库的功能 整个流类体系是一个派生类体系。按ANSI C++标准,类ios是抽象类,它的析构函数是虚函数,它的构造函数为保护的,作为所有基本流类的基类。VC++中有一个构造函数ios (streambuf*)为公有,与ANSI C++不同。
ios istream ostream ifstream iostream oftream strstream fstream istrstream ostrstream
11.1 I/O流类库的功能11.1.1 基本的I/O流类库 在流类库中,最重要的两部分功能为标准输入/输出(standard input/output)和文件处理。 在C++的流类库中定义了四个全局流对象:cin,cout,cerr和clog。可以完成人机交互的功能。 cin标准输入流对象,键盘为其对应的标准设备。 cout标准输出流对象,显示器为标准设备。 cerr和clog标准错误输出流,输出设备是显示器。 其中cin、cout和clog是带缓冲区的,缓冲区由streambuf类对象来管理。而cerr为非缓冲区流,一旦错误发生立即显示。 要使用这四个功能,必须包含<iostream.h>文件。
11.1.2 文件I/O操作流类库 类ifstream由类istream单一派生,专门用来处理文件的输入操作。 类ofstream由类ostream单一派生,专门用来处理文件的输出操作。 类fstream由类iostream单一派生,专门用来处理文件的输入和输出操作。 类ifstream、ofstream、fstream拥有公共基类: fstreambase。 利用上述类创建流对象,类中的成员函数open用来打开文件,成员函数close用来关闭文件,有关细节将在11.5节中讲述。
11.1.3 字符串流操作流类库 类istrstream由类istream单一派生,专门用来处理字符串的输入操作。 类ostrstream由类ostream单一派生,专门用来处理字符串的输出操作。 类strstream由类iostream单一派生,专门用来处理字符串的输入和输出操作。 类istrstream、ostrstream、strstream拥有公共基类: strstreambase。 有关字符串流操作的细节将在11.6节中讲述。
11.2 常用的读写操作 • 11.2.1 屏幕输出操作 • 1.使用预定义的插入符<< • <<是左移位运算符的重载,格式为: • 字符流目的地<<字符流内容 • <<重载函数是ostream类的成员函数,原型为: • ostream & operator<<(const char* psource); • ostream & operator<<(char source); • ostream & operator<<(int source); • … • 需在屏幕显示时,屏幕就是字符流目的地,头文件iostream.h中定义有ostream类的全局对象cout就代表屏幕。
使用<<时应注意运算符的优先级别,必要时,用加括弧的方法保证其他运算符优先运算,例如:使用<<时应注意运算符的优先级别,必要时,用加括弧的方法保证其他运算符优先运算,例如: • cout<<(i>j?i:j)<<endl; • 如果不加(),将因运算顺序不对而编译出错。
【例11.1】插入符用法示例 #include<iostream.h> #include<string.h> void main( ) { cout<<"字符串\"This is a string.\"的长度为:"; cout<<strlen("This is a string.")<<endl; cout<<"字符串\"This is a string.\"占的空间为:"; cout<<sizeof("This is a string.")<<endl; } 运行结果为17和18,因为strlen是求字符串的长度,即字符串中字符的个数;sizeof是求占用内存的字节数,其中包括字符串结束标志空字符占用的内存。strlen在string.h中定义,sizeof是一个运算符。
【例11.2】输出变量地址值示例 #include<iostream.h> void main( ) { int x(100); int *px=&x; cout<<"x="<<x<<"\n十进制&x="<<long(&x)<<endl; cout<<"*px="<<*px<<"\n十进制px="<<long(px)<<endl; cout<<"*px="<<*px<<"\n十进制&px="<<long(&px)<<endl; cout<<"*px="<<*px<<"\n十六进制&px="<<&px<<endl; } 运行结果显示直接输出地址值时是十六进制,若要以十进制显示需做强制类型转换为长整型。
【例11.3】编写判断除数为0的整数除法程序 #include<iostream.h> void fun(int i,int j) { if(j)cout<<"商为:"<<i/j<<endl; else cout<<"除数为0,不能求商!\n";} void main( ) { int x,y; for(int i=0;i<3;i++) { cout<<"输入被除数和除数:";cin>>x>>y; fun(x,y); } } 请仔细阅读本程序,并与课本上的程序比较。
2.使用成员函数put( )输出一个字符put函数函数原型为:ostream& put(char c);使用put函数向屏幕输出字符的格式为:cout.put(字符) 【例11.4】用成员函数put( )输出一个字符的例子 #include<iostream.h> void main( ) { cout<<'B'<<'E'<<'I'<<'J'<<'I'<<'N'<<'G'<<'\n'; cout.put('B').put('E').put('I').put('J').put('I').put('N').put('G').put('\n'); char c1=65,c2=66,c3=67; cout.put(c1).put(c2).put(c3).put('\n'); } 请仔细阅读本程序,注意函数put()的值是ostream类对象的引用,连续输出时连续加.put()
3.使用成员函数write( )输出一个字符串write函数函数原型为:ostream& write(const char *str,int n);使用write函数向屏幕输出字符的格式为:cout.write(字符指针,字符个数) 【例11.5】用成员函数write( )输出一个字符串的例子 #include<iostream.h> #include<string.h> void print(char*s) {cout.write(s,strlen(s)).put('\n');cout.write(s,6)<<'\n';} void main( ) { char*str="我爱北京天门!"; cout<<"字符串为:\""<<str<<"\"\n"; print(str); } 请仔细阅读本程序,注意函数write( )的值是ostream类对象的引用,连续输出时连续加.write( )
11.2.2 键盘输入操作 1.使用预定义的提取符>> >>是右移位运算符的重载,格式为: • 输入流源头>>输入流目的地 • >>重载函数是istream类的成员函数,原型为: • istream & operator>>(int &); • istream & operator>>(char &); • istream & operator>>(char *); • …
需从键盘接收数据时,键盘就是输入流源头,输入流目的地应是变量名,头文件iostream.h中定义有istream类的全局对象cin就代表键盘。需从键盘接收数据时,键盘就是输入流源头,输入流目的地应是变量名,头文件iostream.h中定义有istream类的全局对象cin就代表键盘。 • 提取符>>依次从输入源中提取一个数据项,连续提取时,数据项之间用空格、制表符、换行等空白符分隔。 • 如对语句cin>>x>>y>>z; • 可键入:18 19 20<回车>
1.使用预定义的提取符>> 标准设备(键盘)输入是最不安全的,注意以下几点, 可以避免错误: ① cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢用,如果输入错了,必须在回车之前修改,如果回车键按下就无法挽回了。只有把输入缓冲区中的数据取完后,才要求输入新的数据。不可能用刷新来清除缓冲区,所以不能输错,也不能多输! ② 输入的数据类型必须与要提取的数据类型一致,否则出错,出错只是在流的状态字state(枚举类型io_state)中对应位置位(置1),程序继续。所以要提高健壮性,就必须在编程中加入对状态字state的判断。 ③ 空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输入。但如果是字符型和字符串,则空格(ASCII码为32)无法用cin输入,字符串中也不能有空格。回车符也无法读入。
【例11.6】提取符用法示例 #include<iostream.h> void main( ) { int x,y; cout<<"请输入两个整数:"; cin>>x>>y; cout<<'('<<x<<','<<y<<")\n"; }
2.使用成员函数get( )输入一个字符串get函数函数原型有多个,其中比较简单的2个是:int get( );、istream& get(char& c);前者提取的字符作为函数值,后者提取的字符放在参数c使用get函数从键盘提取字符的格式分别为:cin.get( )、cin.get(字符变量) 【例11.7】用成员函数get( )从键盘提取字符的例子 #include<iostream.h> void main( ) { char ch; cout<<"输入字符串:"; while((ch=cin.get( ))!=EOF)cout.put(ch); }
【例11.8】使用成员函数get带参数的形式输入一个字符【例11.8】使用成员函数get带参数的形式输入一个字符 #include<iostream.h> void main( ) { char ch1,ch2; cout<<"输入字符串:"; while(cin.get(ch1).get(ch2)) cout.put(ch2).put(ch1); } 请仔细阅读本程序,注意这种格式的函数get( )的值是istream类对象的引用,连续输入时连续加.get( )
【例11.9】混合使用成员函数get、提取符输入字符,比较区别。【例11.9】混合使用成员函数get、提取符输入字符,比较区别。 #include<iostream.h> const int N=40; void main( ) { char s1[N],s2[N]; cout<<"输入一个字符串:";cin>>s1; //输入时遇空格、制表符、回车等结束,但这些结束符留在缓冲区中 cout<<"s1="<<s1<<endl; cin.get(s2,N); //从缓冲区中最多接收N-1个字符,放数组s2中,界定符为隐含换行符 cout<<"s2="<<s2<<endl; } 请仔细阅读本程序,注意get函数的第三种原型: istream &get(char *c,int n,char ch='\n'); 这种格式的函数get( )的值是istream类对象的引用,使用格式为:cin.get(字符指针,整数n,界定符) 该函数直接从缓冲区中最多读取n-1个字符数据,若前面遗留有换行,则结束。
3.使用成员函数getline( )输入一行字符getline函数原型是:istream &getline(char *buf,int n,char ch=‘\n’);功能是最多提取n-1个字符放在buf为首地址的缓冲区中,参数ch为终止符,隐含的终止符为换行符。使用getline函数从键盘提取字符串的格式为:cin.getline(字符指针,整数n,终止界定符)输入字符少于n-1时,接收实际输入字符数,并将缓冲区的回车符清除,若输入字符数不少于n-1时,多余的字符及回车符留在缓冲区。该函数终止读取字符的条件为:①读取n-1个字符②遇到参数指定的终止符③遇到文件结束符或其他输入流的结束符。
【例11.10】输入若干行字符,求出最长行的字符个数及输入行数。使用成员函数getline( ) #include<iostream.h> const int SIZE=80; void main( ) { char buf[SIZE]; int lcnt=0,lmax=-1; cout<<"输入若干行字符:"; while(cin.getline(buf,SIZE))//用Ctrl+Z作输入流结束标志 {int count=cin.gcount( ); //gcount计算刚刚用getline函数输入的字符数的成员函数 lcnt++;if(count>lmax)lmax=count; cout<<"line#"<<lcnt<<':'<<count<<endl; cout.write(buf,count).put('\n').put('\n'); } cout<<endl; cout<<"最长行字符数:"<<lmax<<endl; cout<<"总行数:"<<lcnt<<endl; }
4.使用成员函数read( )输入一行字符read函数原型是:istream &read(char *buf,int n);功能是最多提取n-1个字符放在buf为首地址的缓冲区中使用read函数从键盘提取字符串的格式为:cin. read(字符指针 ,整数n)最多接收n个字符,接受字符中可以包括换行符('\n')。该函数终止读取字符的条件为:①读取n个字符②遇到文件结束符(Ctrl+Z)。
【例11.11】输入若干行字符,并输出。使用成员函read( )。 #include<iostream.h> void main( ) { const int SIZE=80; char buf[SIZE]=""; cout<<"输入若干行字符:\n"; cin.read(buf,SIZE); cout<<endl; cout<<buf<<endl; }
11.3 格式化输入输出操作 C++在类ios中提供格式化输入输出,有两种方法控制输入输出格式:一是使用标志位和成员函数,二是使用控制符。 11.3.1 使用成员函数进行格式输出 1.控制格式的标志位定义为公有的无名的枚举类型: enum{ skipws=0x0001, //跳过输入中的空白字符 left=0x0002, //输出左对齐 right=0x0004, //输出右对齐 internal=0x0008, //在输出符号或数字字符后填充 dec=0x0010, //在输入输出时将数据按十进制处理 oct=0x0020, //在输入输出时将数据按八进制处理 hex=0x0040, //在输入输出时将数据按十六进制处理 showbase=0x0080, //在输出时带有表示数制基的字符
11.3 格式化输入输出操作 showpoint=0x0100, //输出浮点数时,必定带小数点 uppercase=0x0200, //输出十六进制,用大写字母 showpos=0x0400, //输出正数时,加”+”号 scientific=0x0800, //科学数方式输出浮点数 fixed=0x1000, //定点数方式输出浮点数 unitbuf=0x2000, //插入后,立即刷新流 stdio=0x4000} //插入后,立即刷新stdout和stderr 该枚举量说明中每一个枚举量实际对应两字节数据(16位)中的一个位,所以可以同时采用几个格式控制,只要把对应位置1即可,这样既方便又节约内存。取多种控制时,用或“|”运算符来合成,合成为一个长整型数,在ios中为: protected: long x_flags; 这个长整型数据成员被称为标志字。
11.3 输入输出的格式控制 类ios中还设置了三个输入输出流格式控制标志: protected: int x_precision;//标志浮点数精度,缺省为6位 int x_width;//输出域宽,缺省域宽为0, //重设域宽只对其后第一输出项有效,如域宽不足,则不受限制 char x_fill;//标志域宽有富余时填入的字符 2. 设置标志字的成员函数 ①long flags( ) 返回标志字函数。 ②long flags(long) 函数值为更新前的标志字,参数作更新后的标志字
③long setf(long setbits,long field)该函数先将第二个参数(转换为二进制)中为1的标志位置0,再将第一个参数(转换为二进制)中为1的标志位置1 。函数值为设置前标志字。 ④long setf(long) 设置参数(转换为二进制)中为1的标志位置1,其余标志位不变。函数值为设置前的标志字。 ⑤long unsetf(long) 设置参数(转换为二进制)中为 1的标志位置0,其余标志位不变。函数值为设置前的标志字。
在ios中定义有如下静态: ①static const long adjustfield; 其值=left|right|internal=0x2|0x4|0x8=0xe ②static const long basefield; 其值=dec|oct|hex=0x10|0x20|0x40=0x70 ③static const long floatfield; 其值=scientific|fixed=0x800|0x1000=0x1800 实际上,上述3个组合设置是有矛盾的,如①中又要左对齐,又要右对齐是不可能的,自己可以编程测试实际结果,上述组合常用于清除标志位。 例如,若需清除数制标志后,再设置十六进制标志,可调用成员函数: cout.setf(ios::hex,ios::basefield)
3. 控制输出格式的成员函数 ios类中有如下控制输出格式的成员函数: ①int width( ); int width(int); 前者函数值为当前输出的数据宽度;后者参数为设置的数据输出宽度,函数值为设置前的数据输出宽度值;默认为实际需要的最少字符数,设置宽度小于默认值时,设置无效。 ②char fill( ); char fill(char); 前者函数值为当前使用的填充字符;后者参数为设置的填充字符,函数值为设置前使用的填充字符;默认填充字符为空格。 ③int precision( ); int precision(int); 前者函数值为当前使用的浮点数有效数字个数;后者参数为设置的浮点数有效数字个数,函数值为设置前使用的浮点数有效数字个数;单精度最多7位(默认6位)有效数字,双精度最多15位(默认6位)有效数字,长双精度最多19位(默认6位) 有效数字。
ios::showbase| ios::uppercase| ios::oct 即0x2A0或01240 ios::showbase| ios::uppercase| ios::oct| ios::scientific 即0xAA0或05240 【例11.12】设置清除标志位的例子 #include<iostream.h> void main( ) { int a=1234;double b=12.345678; cout<<cout.flags( )<<endl; cout.setf(ios::hex,ios::basefield); cout<<cout.flags( )<<endl; cout<<a<<endl; cout.setf(ios::showbase);cout<<a<<endl; cout.setf(ios::uppercase);cout<<a<<endl; cout.setf(ios::oct,ios::basefield);cout<<a<<endl; long oldflag=cout.setf(ios::dec,ios::basefield); cout<<a<<endl; cout.setf(ios::showpos); cout<<a<<endl; cout.flags(oldflag);cout<<a<<endl; cout<<cout.flags( )<<endl;cout<<b<<endl; cout.setf(ios::scientific,ios::floatfield);cout<<b<<endl; cout<<cout.flags( )<<endl; }//运行程序,观察结果。
【例11.13】设置控制小数位数的例子 #include<iostream.h> void main( ) { double d1=12.34567,d2=12.000; cout<<d1<<endl<<d2<<endl; cout.setf(ios::showpoint); cout<<d1<<endl<<d2<<endl; } 运行程序,观察结果,注意: ①默认的是可以不带小数点及小数部分的0 ②默认的有效数字是6位。
【例11.14】设置输出对齐格式的例子 #include<iostream.h> void main( ) { cout<<"12345678901234567890\n"; int i=12345; cout<<i<<endl; cout.width(10); cout.fill('#'); cout.setf(ios::left,ios::adjustfield ); cout<<i<<endl; cout.setf(ios::right,ios::adjustfield ); cout<<i<<endl; cout.precision(6); double d=123.456789; cout<<d<<endl; cout.setf(ios::scientific,ios::floatfield);cout<<d<<endl; cout<<"宽度:"<<cout.width( ); } 运行程序,观察结果,注意①宽度设置一次有效,再次使用需重新设置,②设置有冲突时会怎模样?怎样研究这个问题?
11.3.2 使用控制符进行格式输出 • 控制符又称操作子,是定义在头文件iomanip.h中的对象,可以直接插入到数据流中,被<<和>>操作。 • 下表列出了VC++支持的操作子:
【例11.15】按整数的不同基数设置输出格式的例子【例11.15】按整数的不同基数设置输出格式的例子 #include<iostream.h> #include<iomanip.h> void main( ) { int n; cout<<"输入一个十进制整数:";cin>>n; cout<<n<<"的十六进制形式为:"<<hex<<n<<endl; cout<<dec<<n<<"的八进制形式为:"<<oct<<n<<endl; cout<<dec<<n<<"的十进制形式为:"<<n<<endl; } 运行程序,观察结果,注意进位制基数设置后永久有效,要改变必须重新设置。
【例11.16】设置浮点数精度和填充符的例子 #include<iostream.h> #include<iomanip.h> #include<math.h> void main( ) { double n=sqrt(3); for(int i=0;i<10;i++) { cout<<setprecision(i)<<setw(12)<<setfill('*'); cout<<n<<endl; } } 运行程序,观察结果,注意输出宽度、输出精度(有效数字位数)、填充字符等设置方法。
【例11.17】利用设置填充符、宽度的方法输出菱形【例11.17】利用设置填充符、宽度的方法输出菱形 #include<iostream.h> #include<iomanip.h> void main( ) { for(int i=7;i>1;i--) { cout<<setfill(' ')<<setw(i)<<' '<<setfill('*'); cout<<setw(15-2*i)<<'*'<<endl; } for(i=1;i<8;i++) { cout<<setfill(' ')<<setw(i)<<' '<<setfill('*'); cout<<setw(15-2*i)<<'*'<<endl; } } 运行程序,观察结果,注意打印图形的算法研究,找各行字符个数的规律,注意与【例4.16】比较。
11.4 插入符(<<)与提取符(>>)的重载 为了对类的对象进行插入及提取操作,可以编写重载函数实现插入符、提取符的重载。 【例11.18】重载提取符和插入符,实现中国日期格式的输入输出。(类定义、重载运算符的友元函数定义) #include<iostream.h> class Date { public:Date(int y,int m,int d){Year=y;Month=m;Day=d;} friend ostream&operator<<(ostream&stream,Date&date); friend istream&operator>>(istream&stream,Date&date); private:int Year,Month,Day; }; ostream&operator<<(ostream&stream,Date&date) { stream<<date.Year<<'/'<<date.Month<<'/'<<date.Day<<endl; return stream; } istream&operator>>(istream&stream,Date&date) { stream>>date.Year>>date.Month>>date.Day; return stream; }
【例11.18】重载提取符和插入符,实现中国日期格式的输入输出。(主函数定义)【例11.18】重载提取符和插入符,实现中国日期格式的输入输出。(主函数定义) void main( ) { Date d(2003,3,18); cout<<"当前日期是:"<<d<<"输入新日期:"; cin>>d; cout<<"新日期:"<<d; } 上述主程序中,有5个插入符(<<),有1个提取符(>>),这些符号中哪些使用了友元函数定义的运算符重载,如何区别是否重载?
11.5 磁盘文件的输入和输出操作 本节中文件指的是磁盘文件。C++根据文件(file)内容的数据格式,可分为两类:二进制文件和文本文件。文本文件由字符序列组成,也称ASCII码文件,在文本文件中存取的最小信息单位为字符(character),而二进制文件中存取的最小信息单位为字节(Byte)。 11.5.1 文件的打开与关闭 11.5.4 随机文件的读写 11.5.2 文本文件的读写 11.5.5 文件操作的 其它函数 11.5.3 二进制文件的读写
11.5 磁盘文件的输入与输出操作 11.5.1 文件的打开和关闭操作 1.打开文件 ①说明一个文件流对象,这又被称为内部文件: ifstream 输入文件流对象名;//只可用于输入 ofstream 输出文件流对象名;//只可用于输出 fstream 输入输出文件流对象名; //既可用于输入又可用于输出 ②使用对象的成员函数open打开文件: 文件流对象名.open("文件名",打开方式); 此处的文件名必须是外存上的文件名(外部文件),必要时应指明路径,open函数的作用是在内部文件与外部文件之间建立联系。 ①、②两步可以和二而一,即用对象初始化时的构造函数代替open函数,如: ifstream 输入文件流对象名("文件名",打开方式)
文件访问方式常量表(ios中定义的公有枚举常量)文件访问方式常量表(ios中定义的公有枚举常量)
11.5.1 文件的打开和关闭操作 文件流中三个打开文件的成员函数(open)的原型为: void ifstream::open(const char*,int=ios::in, int=filebuf::openprot); void ofstream::open(const char*,int=ios::out, int=filebuf::opernprot); void fstream::open(const char*,int, int=filebuf::openprot); 第一个参数为要打开的磁盘文件名。第二个参数为打开方式,有输入(in),输出(out)等。第三个参数为指定打开文件的保护方式,一般取缺省。 例如:要新建磁盘文本文件file.txt,并置写状态,可如下进行: ofstream outfile; outfile.open("file.txt",ios::out); 或者:ofstream outfile("file.txt",ios::out); 或者:ofstream outfile; outfile.open("file.txt"); 或者:ofstream outfile("file.txt");
11.5.1 文件的打开和关闭操作 打开文件也应该判断是否成功,若成功,文件流对象值为非零值,不成功为0(NULL),文件流对象值物理上就是指它的地址。 下面是打开一个文件的完整程序段: fstream iofile("myfile.txt",ios::in|ios::out); if(!iofile) {cout<<"不能打开文件:"<<"myfile.txt"<<endl; exit(1); } //失败退回操作系统 2. 关闭文件操作 关闭文件将清理与打开的文件有关的内存与外存,这样即可减少内存负担又可保证文件信息安全。关闭文件使用成员函数close进行: 文件流对象名.close( );//文件流对象名就是内部文件名。
11.5.2 文本文件的读写操作【例11.19】使用插入符向文本文件中写信息 #include<iostream.h>//定义标准输出流对象cout #include<fstream.h>//定义文件流类fstream #include<stdlib.h>//定义abort函数 void main( ) {fstream outfile; outfile.open("file1.dat",ios::out); if(!outfile){cout<<"file1.dat打不开!\n";abort();} outfile<<"这是一个程序。\n"<<"这是一个字符串。\nok"; outfile.close( ); } ①注意分析程序中的3个插入符(<<)的作用 ②注意3个包含文件的作用 ③注意该程序的运行结果如何检验 ④函数abort( )的作用。
【例11.20】使用成员函数getline将文本文件file1.dat中的信息读出并显示在屏幕上。【例11.20】使用成员函数getline将文本文件file1.dat中的信息读出并显示在屏幕上。 #include<iostream.h>//定义标准输出流对象cout #include<fstream.h>//定义文件流类ifstream #include<stdlib.h>//定义abort函数 void main( ) {ifstream infile("file1.dat"); if(!infile){cout<<"file1.dat打不开!\n";abort();} char s[80]; while(!infile.eof( )) { infile.getline(s,sizeof(s));cout<<s<<endl; } infile.close( ); } 注意,①定义内部文件与打开文件的格式与例19的区别 ②循环条件的含义 ③读取文件信息是否可用提取符?
【例11.21】使用成员函数get、put读写文本文件。【例11.21】使用成员函数get、put读写文本文件。 #include<iostream.h>//定义标准输出流对象cout #include<fstream.h>//定义文件流类fstream #include<stdlib.h>//定义abort函数 #include<string.h>//定义strlen函数 void main( ) {fstream infile,outfile("file2.dat",ios::out); if(!outfile){cout<<"file2.dat打不开!\n";abort( );} char s[]=" 我喜欢C++程序设计。"; for(int i=0;i<=(int)strlen(s);i++)outfile.put(s[i]);outfile.close( ); infile.open("file2.dat",ios::in); if(!infile){cout<<"file2.dat打不开!\n";abort( );} char ch;while(infile.get(ch))cout.put(ch); cout<<endl;infile.close( ); } 注意,该程序中共有几个内部文件?有几个外部文件?内外如何对应?用操作系统的办法如何显示本程序产生的外部文件?