C++实验四.doc
实验 四 C+的流类库与输入输出实验课程名:面向对象的程序设计专业班级: 学号: 姓名: 实验时间: 实验地点: 指导教师: 一、实验目的和要求(1)掌握C+格式化的输入输出方法。(2)掌握重载运算符“<<”和“>>”的方法。(3)掌握磁盘文件的输入输出方法。二、 实验内容。1. 下面给出的shiyan4-1.cpp程序用于打印九九乘法表,但程序中存在错误。请上机调试,使得此程序运行后,能够输出如下所示的九九乘法表。* 1 2 3 4 5 6 7 8 91 12 2 43 3 6 9 4 4 8 12 165 5 10 15 20 256 6 12 18 24 30 367 7 14 21 28 35 42 498 8 16 24 32 40 48 56 649 9 18 27 36 45 54 63 72 81/shiyan4-1.cpp#include <iostream>#include <iomanip>using namespace std;int main() int i,j; cout<<”*”;for(i=1;i<=9;i+)cout<<i<<” ”;cout<<endl;for(i=1;i<=9;i+) cout<<i<<” ”; for(j=1;j<=i;j+) cout<<i*j<<” ”;return 0;更正后:#include <iostream>#include <iomanip>using namespace std;int main() int i,j; cout<<"* "for(i=1;i<=9;i+)cout<<i<<" "cout<<endl;for(i=1;i<=9;i+) cout<<i<<" " for(j=1;j<=i;j+) cout<<i*j<<" " cout<<endl; return 0;运行结果:2.下面的程序用于统计文件xyz.txt中的字符个数,请填空完成程序。/shiyan4-2.cpp#include<iostream>#include<fstream>using namespace std;int main() char ch;int i=0;ifstream file;file.open(“xyz.txt”,ios:in);if( !file ) cout<<”xyz.txt cannot open”<<endl; abort();while (!file.eof() file.get(ch) ; i+; cout<<”文件字符个数:”<<i<<endl; file.close(); return 0;3.重载运算符“<<”和“>>”,使其能够输入一件商品的信息和输出这件商品的信息。商品的信息由编号、商品名和价格。假如商品类Merchandise的框架如下:class merchandisepublic: Merchandiss(); Merchandiss(); friend istream& operator>>(istream& in,Merchandiss& s); friend ostream&operator<<(ostream& out,Merchandiss& s);private: int no; char *name; double price;要求实现该类,并编写以下的main函数对该类进行操作。int main() Merchandise mer; cin>>mer; cout<<mer; return 0;程序代码:#include<iostream> #include<string> using namespace std; class Merchandisepublic:Merchandise(int n=0,char na='a',double p=0.0) no=n;name=na;price=p; Merchandise() friend ostream& operator<<(ostream& out,Merchandise& s) cout<<"编号:"<<s.no<<endl;cout<<"名称:"<<s.name<<endl; cout<<"价格:"<<s.price<<endl; return out; friend istream& operator>>(istream& in,Merchandise& s) cout<<"编号:" cin>>s.no; cout<<"名称:" cin>>s.name; cout<<"价格:" cin>>s.price; return in; private: int no; char name; double price; ; int main() Merchandise mer; cout<<"输入商品信息:"<<endl;cin>>mer; cout<<"输出商品信息:"<<endl; cout<<mer; return 0; 运行结果:4.编写一个程序,将两个文本文件连接成一个文件,然后将此文件中所有小写字母转换成大写字母,并打印出来。程序代码:#include<iostream> #include<fstream> #include<string> using namespace std; int main() ofstream fout1("f1.txt",ios:out); if(!fout1) cout<<"f1.txt cannt open.n" exit(1); fout1<<"This is a " ofstream fout2("f2.txt",ios:out); if(!fout2) cout<<"f2.txt cannt open.n" exit(1); fout2<<"program" fout1.close(); fout2.close(); ifstream fin2("f2.txt", ios:in); ofstream fout3("f1.txt", ios:app); string str; while (fin2>>str) fout3<<str; fin2.close(); fout3.close(); ifstream fin1("f1.txt",ios:in); if(!fin1) cout<<"f1.txt cannt open.n" exit(1); char ch; while(!fin1.eof() fin1.get(ch); if(ch>='a'&&ch<='z') ch=ch-32; cout<<ch; cout<<endl; fin1.close(); return 0; 运行结果:5. 将一个源文件复制为两个不同名目的文件,源文件与目的文件均用构造函数打开,使用成员函数get与put复制第一个目的文件,使用getline与插入运算符复制第二个目的文件。(提示:用get函数将输入文件流对象的指针指向文件尾后,无法将该指针移到文件首位置。所以只能定义两个输入文件流对象打开同一源文件,用于两种方式的文件复制。)实验数据:源文件:e:exa.txt,文件内容为souce file目的文件1:e:exb.txt目的文件2:e:exc.txt程序代码:#include<iostream>#include<fstream>#include<string>using namespace std; void createfile() ofstream outfile("a.txt"); if(!outfile) cerr<<"open a.txt error!"<<endl; exit(1); char str100; cin.getline(str,100,'n'); outfile<<str; outfile.close(); void copyfile_b() ofstream outfile("b.txt"); if(!outfile) cerr<<"open b.txt error!"<<endl; exit(1); ifstream infile("a.txt"); if(!infile) cerr<<"open a.txt error!"<<endl; exit(1); char ch; while(infile.get(ch) outfile<<ch; outfile.close(); infile.close(); void copyfile_c() ofstream outfile("c.txt"); if(!outfile) cerr<<"open c.txt error!"<<endl; exit(1); ifstream infile("a.txt"); if(!infile) cerr<<"open a.txt error!"<<endl; exit(1); char ch; while(infile.get(ch) outfile<<ch; outfile.close(); infile.close(); void display(char *filename) ifstream infile(filename); if(!infile) cerr<<"open the file error!"<<endl; exit(1); char ch; while(infile.get(ch) cout.put(ch); cout<<endl; infile.close(); int main() createfile(); copyfile_b(); copyfile_c(); cout<<"a文件t中D的内容为:" display("a.txt"); cout<<"b文件t中D的内容为:" display("b.txt"); cout<<"c文件t中D的内容为:" display("c.txt"); return 0; 运行结果:6. 将存放在源文件(e:exarray1.txt)中学生成绩读入二维整型数组a35中,数组a的第0列存放学号,第4列存放平均成绩。计算出每个学生的平均成绩,用擂台法对数组a按平均成绩升序排序后,存放在目的文件(e:exarray2.txt)中。学生的学号与成绩如实验数据所示。编写程序实现上述要求。实验数据:源文件:e:exarray1.txt,内容如下:1001 90 85 80 01002 807060010038580750目的文件:e:exarray2.txt程序代码:#include<iostream>#include<fstream>using namespace std; void createfile() ofstream outfile("array1.txt"); int a34; int i,j; for(i=0;i<3;i+) cout<<"请输入第"<<i+1<<"个学生的信息:" for(j=0;j<4;j+) cin>>aij; for(i=0;i<3;i+) for(j=0;j<4;j+) outfile<<aij; outfile<<' ' outfile<<'n' /tarray1void sort() /排序并创建文件tarray2 ifstream infile("array1.txt"); int a35; int i,j,t; double s=0; for(i=0;i<3;i+) for(j=0;j<4;j+) infile>>aij; s=s+aij; s=(s-ai0)/3; ai4=s; s=0; for(j=0;j<2;j+) for(i=0;i<2-j;i+) if(ai4>ai+14) for(t=0;t<5;t+) s=ait; ait=ai+1t; ai+1t=s; ofstream outfile("array2.txt"); if(!outfile) cerr<<"open file error!" exit(1); for(i=0;i<3;i+) for(j=0;j<5;j+) outfile<<aij; outfile<<' ' outfile<<'n' void display_file(char*filename) ifstream infile(filename); if(!infile) cerr<<"open file error!"<<endl; exit(1); int a35; int i,j; for(i=0;i<3;i+) for(j=0;j<5;j+) infile>>aij; cout<<aij<<' ' cout<<endl; cout<<endl; int main() createfile(); sort(); display_file("array2.txt"); return 0; 运行结果:三、 结论 通过本次实验,我掌握C+格式化的输入输出方法,还掌握重载运算符“<<”和“>>”的方法,掌握磁盘文件的输入输出方法。12 +法方输类件握,的入>输”符载握法输输格 握验过结果;0 ;" ( );( ) ; < ; ' <>) ; ) ; ,; ;) ; < <) !;) ) _ ;< ; < ; )+ 0 )+ ; ) ;" <) ;" " ; += ;) ) )+;< )+ ;0 ;=;/0 +; )+ );0 ;0 ; ; ) "( 件并/) ;'< ;<< ;<< ) ; )+ ;0 )+ ; ;:的学< "入<) < ; ; ;) " ) ; < 码 . : 0 0 0 下容 ::据求述现序编据实成学学中 文在,序升均组对用成的个出计成放,放存 数 组型维成学 :件存果 ; ;" " ;:内 文"< ) ;"内的 " " ;:容中文< ) ;) ;( ( ) ; << ; ) . ) ; < ) ; ) ) ;) < )( ; ) ; <! < ) !;) " ) ; <! < ) ;) " ) ) ;( . < ) . ; (; <" "<) ;" ; ! ") !;" " )(_ ) ;< ;',( 0 ;<< . " ) !;) " )( ; 码 : 件 . 内, .:据。文种于文一开件输两只所置件指将后尾指象件入函 用提文二制运插 文个一 与数员,数造均目文,目名两件源将果;0 ;( . ; < ; < - = &= ; ) ; ;(;" " ) ;: ; .;) ; < > ( ; ; , ( ;) ) ;( ; " ; ;" .< ) ; " ; <);". < ) ; , .( ; > < > < > 码来来并写换字有中文然个接文本将程果 ; ; < ; "息出< > <息品"< )( ; ; ; : ; ; >"价 ; >:称 ;:"<) > ; ; <<" ;< .<"" <.<号< ) ( & ; ) '= 0 ; > > 码0 < ( 作行类函 下编并 ) < )& > ) ) 下架 品如价品号息品。信件和的商入够”><符运0 ( * = <<数字件 + ; (. * ) ( ) < < ! ) ,” “ . 0= ( < < .- 序程填,个 件用程果0 ;< ; < +; "" < + ;= <""< + ; ("*< ( < 后0 ; ”*< + ;= ” << +; <” <<+ ; (”* ( < < . 表法的示如能运程得机上错序,乘九于 - 给容。方入件盘握法方>”“符握法出入化+掌要目 师指 点验 : 号 设程象:名