大二(下)C++ 流运算符的重载及文件的使用

(链接错误)出错原因:
在类内声明友元函数时,需要在上面加上 模板头 template<class T>。(具体原因还不是很清楚)

解决办法:
(a)在上面加上一行模板头即可。
(b)声明时使用  friend ostream& operator<< <>(ostream& os, const Stack<T>&) 
可以解决。(多加了一个 <>)

实验题目(1): 在多态性实验第2题的基础上,在复数类中增加输入流运算符>>和输出流运算符<<的重载,主函数通过“cin>>对象名”输入对象的值,通过“cout<<对象名”输出对象的值,输出复数值时将原来主函数中“对象名.print( )”改成“cout<<对象名”形式。
在上一步完成的基础上,将复数类改成一个类模板,只设一个模板参数,即实部和虚部用同一种类型,修改相应的代码,完成输入、输出功能。

#include<iostream>
using namespace std;
template<class T>
class Complex
{
private:
	T real;
	T imag;
public:
	Complex(T r = 0, T i = 0)
	{
		real = r;
		imag = i;
	}
	template<class T>
	friend Complex<T> operator +(const Complex<T>  &a, const Complex<T>  &b);
	template<class T>
	friend Complex<T> operator -(const Complex<T>  &a, const Complex<T>  &b);
	template<class T>
	friend ostream  & operator <<(ostream & stream, Complex<T> & a);
	template<class T>
	friend istream  & operator >>(istream & stream, Complex<T> & a);
	
	
	Complex<T> operator *(Complex<T>  &a);
	Complex<T> operator /(Complex<T>  &a);
	
};

template<class T>
Complex<T> Complex<T>::operator *(Complex<T> &a)
{
	real = real * a.real;
	imag = imag * a.imag;
	return *this;
}

template<class T>
Complex<T> Complex<T>::operator /(Complex<T> &a)
{
	Complex temp;
	real = real / a.real;
	imag = imag / a.imag;
	return *this;
}


template<class T>
istream & operator >>(istream & stream, Complex <T> & a)
{
	cout << "real = ";
	stream >> a.real;
	cout << "imag = ";
	stream >> a.imag;
	return stream;
}

template<class T>
ostream & operator <<(ostream & stream, Complex <T> & a)
{
	cout << a.real;
	if (a.imag != 0)
	{
		if (a.imag > 0)
		{
			cout << "+";
		}
		cout << a.imag << " i";
	}
	cout << endl;
	return stream;
}

template<class T>
Complex <T> operator +(const Complex <T> &a, const Complex <T> &b)
{
	Complex <T> temp;
	temp.real = a.real + b.real;
	temp.imag = a.imag + b.imag;
	return temp;
}

template<class T>
Complex <T> operator -(const Complex <T> &a, const Complex <T> &b)
{
	Complex <T> temp;
	temp.real = a.real - b.real;
	temp.imag = a.imag - b.imag;
	return temp;
}

int main()
{
	Complex <double>  a1, a2;
	Complex <double>  a3, a4, a5, a6;
	cout << "a1 :" << endl;
	cin >> a1;
	cout << "\na2 :" << endl;
	cin >> a2;
	cout << "\na1 is:" << a1 ;
	cout << "a2 is:" << a2 << endl;
	a3 = a1 + a2;
	cout << "a3 = a1+a2 = " << a3 ;
	a4 = a1 - a2;
	cout << "a4 = a1-a2 = " << a4 ;
	
	a5 = a1 * a2;
	cout << "a5 = a1*a2 = " << a5 ;
	a6 = a1 / a2;
	cout << "a6 = a1/a2 = " << a6 ;
	
	while (1)
	{
		getchar();
	}
	return 0;
}
#include <iostream>
using namespace std;

template<class T>
class Complex
{
	T real;
	T imag;
public:
	Complex(T r = 0, T i = 0)
	{
		real = r;
		imag = i;
	}
	template<class T>
	friend ostream  & operator <<(ostream & stream, Complex <T> & a);
	template<class T>
	friend istream  & operator >>(istream & stream, Complex <T>  & a);
	template<class T>
	friend Complex<T> operator +(const Complex <T> &a, const Complex <T> &b);
};

template<class T>
istream & operator >>(istream & stream, Complex <T> & a)
{
	cout << "real = ";
	stream >> a.real;
	cout << "imag = ";
	stream >> a.imag;
	return stream;
}

template<class T>
ostream & operator <<(ostream & stream, Complex <T> & a)
{
	cout << a.real;
	if (a.imag != 0)
	{
		if (a.imag > 0)
		{
			cout << " + ";
		}
		cout << a.imag << " i";
	}
	cout << endl;
	return stream;
}

template<class T>
Complex <T> operator +(const Complex <T> &a, const Complex <T> &b)
{
	Complex <T> temp;
	temp.real = a.real + b.real;
	temp.imag = a.imag + b.imag;
	return temp;
}

int main()
{
	Complex<int> a1, a2, a3;
	cout << "a1 :\n";
	cin >> a1;
	cout << "\na2 : \n";
	cin >> a2;
	cout << "\na1 = : " << a1;
	cout << "a2 = : " << a2;
	a3 = a1 + a2;
	cout << "a3 = a1 + a2 = " << a3 << endl;

	while (1)
	{
		getchar();
	}
	return 0;
}

实验题目2:事先用Windows的记事本建立一个文本文件ff.txt。
① 编写一个函数void ReadFile(char* s)实现读取以s串为文件名的文本文件的内容在屏幕上显示。
② 编写一个函数void Change(char s1,char s2)将文本文件中的小写字母全部改写成大写字母生成一个新文件ff2.txt。
③ 主函数中调用ReadFile(“ff.txt”);显示ff.txt的内容,调用Change (“ff.txt” ,“ff2.txt”);根据ff.txt文件作修改生成一个新的文件ff2.txt,最后再调用ReadFile(“ff2.txt”);显示新文件的内容。

#include<iostream>
#include<fstream>
using namespace std;
//编写一个函数void ReadFile(char* s)实现读取以s串为文件名的文本文件的内容在屏幕上显示
void ReadFile(char *s) 
{ 
	char ch;
    ifstream inf(s);
	if (!inf) 
	{
		cout << "Cannot open the file!\n";
		return; 
	}
	while (inf.get(ch))
	{
		cout << ch ;
	}
	inf.close(); 
}
//编写一个函数void Change(char *s1,char *s2)将文本文件中的小写字母全部改写成大写字母生成一个新文件ff2.txt。
void Change(char *s1,char *s2)
{
	ifstream ifile(s1);
	if(!ifile)
	{
		cout<<"ifile cannot be openned!"<<endl;
		return;
	}
	ofstream ofile(s2);
	if (!ofile)
	{
		cout << "ofile cannot be openned!" << endl;
		return;
	}
	char ch;
	while(ifile.get(ch))
	{
		ch=ch-32;
		ofile.put(ch);
	}
	ifile.close();
	ofile.close();
}
//主函数中调用ReadFile("ff.txt");显示ff.txt的内容,调用Change ("ff.txt" ,"ff2.txt");
//根据ff.txt文件作修改生成一个新的文件ff2.txt,最后再调用ReadFile("ff2.txt");显示新文件的内容。
int main()
{
	ReadFile("d:\\ff.txt");
	Change("d:\\ff.txt", "d:\\ff2.txt");
	ReadFile("d:\\ff2.txt");
	while (1)
	{
		getchar();
	}
	return 0;
}

实验题目3(选做):定义学生类,该类包含学生的一些基本信息:学号、姓名、性别、成绩。定义流对象,实现用write函数将学生信息以二进制方式写到磁盘文件stu.dat中。再用read将磁盘中的学生信息读到内存显示在屏幕上。

#include<iostream>
#include<fstream>
using namespace std;
#pragma warning(disable:4996)
class Student
{
	char num[10];
	char name[10];
	char sex[3];
	int score;
public:
	Student(char *nu=" ", char *na=" ", char *se=" ", int s = 0);
	friend ostream & operator<<(ostream &out, const Student &s);
};

Student::Student(char *nu , char *na , char *se , int s)
{
	strcpy(name, nu);
	strcpy(name, na);
	strcpy(name, se);
	score = s;
}

ostream & operator<<(ostream &out, const Student &s)
{
	out << "\n Number:" << s.num << "   Name:" << s.name << "   Sex:" << s.sex << "   Score:" << s.score;
	return out;
}

void CreateBiFile(char *filename)
{
	ofstream out(filename);
	Student stu[3] = 
	{ 
		Student("001","Sewsa","女",100),
	    Student("002","Gewsa","女",90) ,
	    Student("003","Wewsa","女",95) 
	};
	out.write((char *)stu, sizeof(Student) * 3);
	out.close();
}

void ReadBiFile(char *filename)
{
	Student stu[3];
	int i = 0;
	ifstream in(filename);
	while (!in.eof())
	{
		in.read((char*)&stu[i++], sizeof(Student));
	}
	for (int j = 9; j < i - 1; j++)
	{
		cout << stu[j];
	}
	in.close();
}

int main()
{
	CreateBiFile("D:\\ff.dat");
	ReadBiFile("D:\\ff.dat");
	
	while (1)
	{
		getchar();
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值