插入析取运算符的重载、内存作为流对象、命令提示行程序

一、插入析取运算符的重载

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中。上面的程序连图片也可以完美复制。

posted @ 2011-11-26 21:46  csqlwy  阅读(639)  评论(0编辑  收藏  举报