插入析取运算符的重载、内存作为流对象、命令提示行程序
一、插入析取运算符的重载
1.为cout和cin重载
例子:
#include<iostream> using namespace std; class Distance { public: Distance():feet(0),inches(0.0) { } Distance(int ft,float in):feet(ft),inches(in) { } friend istream& operator >> (istream& s,Distance& d); friend ostream& operator << (ostream& s,Distance& d); private: int feet; float inches; }; istream& operator >> (istream& s,Distance& d) { cout<<"Enter the feet: "; s>>d.feet; cout<<"Enter the inches: "; s>>d.inches; return s; } ostream& operator << (ostream& s,Distance& d) { s<<d.feet<<"\'-"<<d.inches<<"\""; return s; } int main() { Distance dist1,dist2; Distance dist3(11,3.22); cout<<"Enter two Distance values: "<<endl; cin>>dist1>>dist2; cout<<"dist1= "<<dist1<<endl <<"dist2= "<<dist2<<endl; cout<<"dist3= "<<dist3<<endl; return 0; }
通过上面的运算符重载,上面的程序对象就像基本类型一样,既好看又自然。
① 他们返回是istream和ostream的对象的引用,这个返回值允许组成链。
② 运算符的两个参数,都是通过引用来传递。第一个参数流对象,第二个参数类对象。注意这里要用到友元函数。
2.为文件重载这两个运算符
#include<iostream> #include <fstream> using namespace std; class Distance { public: Distance():feet(0),inches(0.0) { } Distance(int ft,float in):feet(ft),inches(in) { } friend istream& operator >> (istream& s,Distance& d); friend ostream& operator << (ostream& s,Distance& d); private: int feet; float inches; }; istream& operator >> (istream& s,Distance& d) { char ch; s>>d.feet>>ch>>ch>>d.inches>>ch; return s; } ostream& operator << (ostream& s,Distance& d) { s<<d.feet<<"\'-"<<d.inches<<"\""; return s; } int main() { char ch; Distance dist1; ofstream ofile; ofile.open("dist.dat"); do { cout<<"Enter the distance: "; cin>>dist1; ofile<<dist1; cout<<"是否继续?"; cin>>ch; } while (ch=='y'); ofile.close(); ifstream ifile; ifile.open("dist.dat"); while(true) { ifile>>dist1; if(ifile.eof()) break; cout<<"distance= "<<dist1<<endl; } return 0; }
二、内存作为流对象
可以把内存中的一段作为流对象对待,在中间插入数据如同对文件进行操作一样。
向内存中输出数据时,使用类ostrstream,从内存中输入数据的时候使用类istrstream,如果内存对象就有输入又有输出,可以使用由类iostream派生的类strstream。
创建ostrstream对象,使用内存缓冲区及其大小作为参数传递给流的构造函数。
例子:
#include<iostream> #include<strstream> #include<iomanip> using namespace std; const int SIZE=80; int main() { //定义一些数据 char ch='x'; int j=77; double d=2342.234; char str1[]="aldjfa"; char str2[]="asdlfj"; //定义内存缓冲区 char membuff[SIZE]; //使用内存缓冲区及其大小作为参数传送给流的构造函数 ostrstream omem(membuff,SIZE); //插入数据 omem<<"ch="<<ch<<endl <<"j="<<j<<endl <<setiosflags(ios::fixed) <<setprecision(2) <<"d="<<d<<endl <<"str1="<<str1<<endl <<"str2="<<str2<<endl <<ends; cout<<membuff; return 0; }
三、命令提示行程序
下面来简单的看下main函数的两个参数的应用:
int main(int argc,char* argv[]) 其中第一个参数指命令提示行的参数数量(包括执行文件名);第二个参数指储存每个参数的储存数组
实例:
#include<iostream> #include<fstream> using namespace std; int main(int argc,char* argv[]) { char ch; if (argc!=3) { cerr<<"参数输入错误"<<endl <<"用法:ccopy 参数1 参数2"<<endl <<"参数1:被拷贝的原函数 参数2:要拷贝到的目的函数"<<endl; exit(-1); } ifstream infile; infile.open(argv[1],ios::binary); if (!infile) { cerr<<"参数1打开失败"; exit(-1); } ofstream outfile; outfile.open(argv[2],ios::binary); if (!outfile) { cerr<<"参数2打开失败"; exit(-1); } while(infile) { infile.get(ch); outfile.put(ch); } return 0; }
上面的程序,编译生成可执行文件ccpoy.exe
如在命令提示行下输入: ccopy.exe a.txt b.txt 就会把文件a中的东西复制到b中。上面的程序连图片也可以完美复制。