C++实验9 输入输出流

所使用的开发工具及环境:PC机一套 Visual Studio 2010

实验要求
1.硬件基本配置:Intel PentiumIII以上级别的CPU,大于64MB的内存。
2.软件要求:Window 2000操作系统,Visual Studio 6.0或更高版本开发环 境。
3.实验学时:2学时
4.实现实验内容中的题目。
5.写实验报告

实验目的
1、深入理解C++的输入输出的含义与其实现方法。
2、掌握标准输入输出流的应用。
3、掌握对文件的输入输出操作。
实验内容:
(1) 输入三角形的三边a,b,c,计算三角形的面积的公式是
, //20分,
形成三角形的条件是:a+b>c,b+c>a,a+c>b
编写程序,输入a,b,c,检查a,b,c是否满足以上条件,如不满足,由cerr输出有关出错信息。

#include<iostream>
#include<cmath>
using namespace std;
int main(){
	double a,b,c,s,area;
	cin>>a>>b>>c;
	if(a+b<=c)
		cerr<<"a+b<=c,error!"<<endl;
	else if(b+c<=a)
		cerr<<"b+c<=a,error!"<<endl;
	else if(c+a<=b)
		cerr<<"c+a<=b,error!"<<endl;
	else 
	{
		s=(a+b+c)/2;
		area=sqrt(s*(s-a)*(s-b)*(s-c));
		cout<<"area="<<area<<endl;
	}
	return 0;
} 

(2)(读写文本文件)建立两个磁盘文件f1.dat和f2.dat,编程序实现以下工作://30分
①从键盘输入20个整数,分别存放在两个磁盘文件中(每个文件中放10个整数);
②从f1.dat读入10个数,然后存放到f2.dat文件原有数据的后面;
③从f2.dat中读入20个整数,将它们按从小到大的顺序存放到f2.dat(不保留原来的数据)。

#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
int a[100]={0};
const int Count=20;
void createDat(char *s){
	fstream f1,f2;
	f1.open("f1.dat",ios::out);
	f2.open("f2.dat",ios::out);
}
void writeDat(int i){
	fstream f1;
	f1.open("f1.dat",ios::app);
	fstream f2;
	f2.open("f2.dat",ios::app);
	if(i%2==0)
	f1<<i<<'\t';
	else
	f2<<i<<'\t';
	f1.close();
	f2.close();
}
void readDat(){
	fstream f1,f2;
	f1.open("f1.dat",ios::in);
	f2.open("f2.dat",ios::in);
	int i=0;
	while(!f1.eof()){
		f1>>a[i++];
	}
	i--;
	while(!f2.eof()){
		f2>>a[i++];
	}
}

int main(){
	createDat("f1.dat");
	createDat("f2.dat");
	int i,j;
	for(j=0;j!=Count;j++){
	cin>>i;
	writeDat(i);
}
	readDat();
	sort(a,a+Count);
	for(i=0;i<Count;i++)
	cout<<a[i]<<endl;
	return 0;
}

(3)(读写二进制文件)编程序实现以下功能: (50分)
a)按职工号由小到大的顺序将5个员工的数据(包括号码、姓名、年龄、工资)输出到磁盘文件中保存。
b)从键盘输入两个员工的数据(职工号大于已有的职工号),增加到文件的末尾。
c)输出文件中全部职工的数据。
d)从键盘输入一个号码,从文件中查找有无此职工号,如有则显示此职工是第几个职工,以及此职工的全部数据。如没有,就输出“无此人”。可以反复多次查询,如果输入查找的职工号为0,就结束查询。
参考如下类结构:

class staff
{
public:void input();
	   void display();
private:
	int id;//职工号
	char name[20];
	int age;
	double pay;//工资

};
class FileHandle
{
public:FileHandle(char *pn);
	   void writeBinaryFile();
//在此函数中输入5个职工信息,再把5人信息写到二进制文件staff.dat中
	   void writeBinaryFile(staff *pstaff,n);
//在此函数中直接写pstaff所指数组中的n个职工信息到二进制文件staff.dat中,其中n个职工信息在主函数中通过键盘输入
	   void readBinaryFile(staff *pstaff,int &n);
//从staff.dat文件中读员工信息出来存入pstaff所指数组中,所读到的职工数存入n中
private:
	char *filename;
};
int searchStaff(satff *pstaff,int n,int id);//实现在pstaff所指数组n个元素中查找员工号为id的员工。找到返回其在数组中的下标,未找到返回-1


#include<iostream> //通用输入流和其他输入流的基类
#include<fstream> //输入输出文件流类
#include<stdlib.h> //标准库头文件
using namespace std;
//录入员工信息
class staff
{
public:
staff(){}
//构造函数
staff(int num, char n[20], int ages, double wages)
{
id = num; 
strcpy_s(name,n);
age = ages;
pay = wages;
}
//输入员工信息
void input()
{
cout << " 职工号 : ";
cin >> id;
cout << " 姓名 : ";
cin >> name;
cout << " 年龄 : ";
cin >> age;
cout << " 工资 : ";
cin >> pay;
}
//输出员工信息
void display()
{cout << " 职工号 : " << id << " 姓名 : " << name << " 年龄 : " << age << " 工资 : " << pay << endl;}
int getid()
{
return id;
}
private:
int id; //职工号
char name[20]; //姓名
int age; //年龄
double pay; //工资
};
class FileHandle
{
public:
FileHandle(char *pn):filename(pn){}

//在此函数中输入5个职工信息,再把5人信息写到二进制文件staff.dat中
void writeBinaryFile(staff *pstaff, int n)
{
ofstream iofile(filename, ios::in|ios::out|ios::binary);
if(!iofile)
{
cerr << "open error!" << endl; //打开错误
abort(); //异常退出
}
for(int i = 0; i < n; i++) 
{
iofile.write((char *)&pstaff[i],sizeof(pstaff[i])); //写入文件
}
iofile.close();
}

//在此函数中直接写pstaff所指数组中的n个职工信息到二进制文件
//staff.dat中,其中n个职工信息在主函数中通过键盘输入
void writeBinaryFile(staff *pstaff)
{
ofstream iofile(filename, ios::out|ios::app);
if(!iofile)
{
cerr << "open error!" << endl;
abort(); //异常退出
}
iofile.seekp(0, ios::end);
//定位 直接跳到当前流的结尾,略过流内的所有数据。
iofile.write((char *)&pstaff, sizeof(staff));
iofile.close();
}

//从staff.dat文件中读员工信息出来存入pstaff所指数组中,所读到的职工数存入n中
void readBinaryFile(staff *pstaff, int n)
{
ifstream ifile(filename, ios::in|ios::out|ios::binary);
//创建输入文件,以输入文件打开,并以二进制方式输入
if(!ifile)
{
cerr << "open error!" << endl;
abort();
}
for(int i=0;i<n;i++)
ifile.read((char *)&pstaff[i], sizeof(pstaff[i]));
//读取文件内容以及文件长度
ifile.close();
}

//实现在pstaff所指数组n个元素中查找员工号为id的员工。
//找到返回其在数组中的下标,未找到返回-1
void searchStaff(int num)
{
bool find = false;//将find定义为错
ifstream ifile(filename, ios::in|ios::binary);
if(!ifile)
{
cerr<< " open error! " <<endl;
abort();
}
staff s;//定义成员名
while(!ifile.eof())//遍历文件内数据
{
ifile.read((char *)&s, sizeof(s));
if(s.getid() == num)
{
find = true;
break;
}
}
if(find)
{
int m = ifile.tellg(); //得到输入文件位置标记的当前位置
cout << num << " is NO. "<< m/sizeof(staff) << endl;
s.display();
}
else
{
cout << " -1 " << endl;
}
ifile.close();
}
private:
char *filename;
};

//测试
int main(){
staff staf[7] = {2001, "zhao", 34, 1203, 2002, "qian", 23, 674, 2003, "sun", 54, 778, 
2004, "li", 45, 476,2005, "zhou", 39, 656};
FileHandle file("staff.dat");
file.writeBinaryFile(s1, 5);
cout<< "please input data you want insert:" << endl;
staff s;
for(int i = 0; i < 1; i++){
s.input();
file.writeBinaryFile(&s);
}
staff s2[6];
file.readBinaryFile(s2, 6);
for(int i = 0; i < 6; i++){
s2[i].display();
}
cout << " enter number you want search,enter 0 to stop. ";
int num;
cin >> num;
while(num){
file.searchStaff(num);
cout << " enter number you want search,enter 0 to stop. ";
cin >> num;
}
return 0;
}

结果与分析 ( 收获、问题 )
1、深入理解C++的输入输出的含义与其实现方法。
2、掌握标准输入输出流的应用。
3、掌握对文件的输入输出操作。

猜你喜欢

转载自blog.csdn.net/qq_44621510/article/details/92368709