c++ 教材循环


#pragma once
#define detail_short 20
#define value_size 5
class book_recycle
{

public:
	book_recycle() {}
	book_recycle(char* bname, char* bisbn, char* bauthor, char* bnum, char* bdamage)
	{
		strncpy_s(book_name,bname,sizeof(bname));
		strncpy_s(book_isbn,bisbn, sizeof(bisbn));
		strncpy_s(book_author,bauthor,sizeof(bauthor));
		strncpy_s(book_sum, bnum, sizeof(bnum));
		strncpy_s(book_damage, bdamage, sizeof(bdamage));
	}
	~book_recycle() {}

	const char *get_book_name() const { return book_name; }
	const char *get_book_isbn() const { return book_isbn; }
	const char *get_book_author() const { return book_author; }
	const char *get_book_sum() const { return book_sum; }
	const char *get_book_available() const { return book_available; }
	const char *get_book_damage() const { return book_damage; }
	const char *get_book_scrap_num() const { return book_scrap_num; }

	void set_book_name(char *bname) { strncpy_s(book_name, bname, detail_short); }
	void set_book_isbn(char* bisbn) { strncpy_s(book_isbn, bisbn, detail_short); }
	void set_book_author(char* bauthor) { strncpy_s(book_author, bauthor, detail_short); }
	void set_book_sum(char *bnum) { strncpy_s(book_sum, bnum, value_size);}
	void set_book_available(char *bavailable) { strncpy_s(book_available, bavailable, value_size); }
	void set_book_damage(char *bdamage) { strncpy_s(book_damage, bdamage, value_size); }
	void set_book_scrap_num(char *bscrap_num) { strncpy_s(book_scrap_num, bscrap_num, value_size); }

	void book_enter();
	void deldata(int &num);
private:
	char book_name[detail_short];
	char book_isbn[detail_short];
	char book_author[detail_short];
	char book_sum[value_size];
	char book_available[value_size];
	char book_damage[value_size];
	char book_scrap_num[value_size];
};

class entry_exit_book
{

public:
	entry_exit_book() {}
	entry_exit_book(char* cname, char* bname, char* bisbn, char* entnum)
	{
		strncpy_s(class_name, cname, detail_short);
		strncpy_s(book_name, bname, detail_short);
		strncpy_s(book_isbn, bisbn, detail_short);
		strncpy_s(enter_num, entnum, value_size);
	}
	entry_exit_book(char* cname, char* bname, char* bisbn, char* exnum, char* bdamage, char* bscrap_num)
	{
		strncpy_s(class_name, cname, detail_short);
		strncpy_s(book_name, bname, detail_short);
		strncpy_s(book_isbn, bisbn, detail_short);
		strncpy_s(exit_num, exnum, value_size);
		strncpy_s(book_damage, bdamage, value_size);
		strncpy_s(book_scrap_num, bscrap_num, value_size);
	}
	~entry_exit_book() {}

	const char *get_class_name() const { return class_name; }
	const char *get_book_name() const { return book_name; }
	const char *get_book_isbn() const { return book_isbn; }
	const char *get_enter_num() const { return enter_num; }
	const char *get_exit_num() const { return exit_num; }
	const char *get_book_damage() const { return book_damage; }
	const char *get_book_scrap_num() const { return book_scrap_num; }

	void set_class_name(char* cname) { strncpy_s(class_name, cname, detail_short); }
	void set_book_name(char *bname) { strncpy_s(book_name, bname, detail_short); }
	void set_book_isbn(char* bisbn) { strncpy_s(book_isbn, bisbn, detail_short); }
	void set_enter_num(char *entnum) { strncpy_s(enter_num, entnum, value_size); }
	void set_exit_num(char *exitnum) { strncpy_s(exit_num, exitnum, value_size); }
	void set_book_damage(char *bdamage) { strncpy_s(book_damage, bdamage, value_size); }
	void set_book_scrap_num(char *bscrap_num) { strncpy_s(book_scrap_num, bscrap_num, value_size); }

	void writr_enter_data();
	void writr_exit_data();
private:
	char class_name[detail_short];
	char book_name[detail_short];
	char book_isbn[detail_short];
	char enter_num[value_size];
	char exit_num[value_size];
	char book_damage[value_size];
	char book_scrap_num[value_size];
};
#include<fstream>
#include<iostream>
#include<cstring>
#include<iomanip>
#include "book.h"
using namespace std;

void view_all_book(int);

void book_recycle::book_enter()
{
	ofstream os;
	os.open("book.bat", ios::binary | ios::out | ios::app);
	try
	{
		os.write(get_book_name(), detail_short);
		os.write(get_book_isbn(), detail_short);
		os.write(get_book_author(), detail_short);
		os.write(get_book_sum(), value_size);
		os.write(get_book_available(), value_size);
		os.write(get_book_damage(), value_size);
		os.write(get_book_scrap_num(), value_size);
	}
	catch (...)
	{
		throw "Open file defeated";
		os.close();
	}
	os.close();
}

void book_recycle::deldata(int &num)
{
	long response;
	int num_after = 0;
	fstream book_is;
	fstream tempfile;
	ofstream book_os;
	char ch_temp[detail_short * 3 + value_size * 4];
	book_is.open("book.bat", ios::binary | ios::in | ios::out);
	tempfile.open("temp.bat", ios::binary | ios::in | ios::out | ios::trunc);
	book_is.seekg(0, ios::end);
	response = book_is.tellg();
	num_after = response / (detail_short * 3 + value_size * 4);
	if (num<0 && num>num_after)
	{
		throw "Error";
	}
	else
	{
		book_is.seekg((num)*(detail_short * 3 + value_size * 4), ios::beg);
		for (int a = 0; a < (num_after - num); a++)
		{
			memset(ch_temp, 0, (detail_short * 3 + value_size * 4));
			book_is.read(ch_temp, (detail_short * 3 + value_size * 4));
			tempfile.write(ch_temp, (detail_short * 3 + value_size * 4));
		}
		book_is.close();
		tempfile.seekg(0, ios::beg);
		book_os.open("book.bat");
		book_os.seekp((num - 1)*(detail_short * 3 + value_size * 4), ios::beg);
		for (int i = 0; i < (num_after - num); i++)
		{
			memset(ch_temp, 0, (detail_short * 3 + value_size * 4));
			tempfile.read(ch_temp, (detail_short * 3 + value_size * 4));
			book_os.write(ch_temp, (detail_short * 3 + value_size * 4));
		}
	}
	tempfile.close();
	book_os.close();
	remove("temp.txt");
}

void entry_exit_book::writr_enter_data()
{
	ofstream os;
	os.open("enterdata.bat", ios::binary | ios::out | ios::app);
	try
	{
		os.write(get_class_name(), detail_short);
		os.write(get_book_name(), detail_short);
		os.write(get_book_isbn(), detail_short);
		os.write(get_enter_num(), value_size);
	}
	catch (...)
	{
		throw "Open file defeated";
		os.close();
	}
	os.close();;
}

void entry_exit_book::writr_exit_data()
{
	ofstream os;
	os.open("exitdata.bat", ios::binary | ios::out | ios::app);
	try
	{
		os.write(get_class_name(), detail_short);
		os.write(get_book_name(), detail_short);
		os.write(get_book_isbn(), detail_short);
		os.write(get_exit_num(), value_size);
		os.write(get_book_damage(), value_size);
		os.write(get_book_scrap_num(), value_size);
	}
	catch (...)
	{
		throw "Open file defeated";
		os.close();
	}
	os.close();;
}

long getfilelen(ifstream & ifs)
{
	long tmp, res;
	ifs.seekg(0, ios::beg);
	tmp = ifs.tellg();
	ifs.seekg(0, ios::end);
	res = ifs.tellg();
	ifs.seekg(tmp, ios::beg);
	return res;
}

void userdeal(int num)
{
	char buf;
	cout << " n显示下一页 r返回" << endl;
	cin >> buf;
	if (buf == 'r' || buf == 'm')
		return;
	if (buf == 'n')
		view_all_book(num);
}

void view_enter_record(void)
{
	long filelen;
	int record_num;
	bool rt_book = false;
	char classname[detail_short];
	char bname[detail_short];
	char bisbn[detail_short];
	char num[value_size];
	ifstream file;
	file.open("enterdata.bat", ios::binary | ios::in | ios::app);
	filelen = getfilelen(file);
	record_num = filelen / (detail_short * 3 + value_size );
	if (record_num >= 1)
		rt_book = true;
	system("cls");
	cout << setw(5) << "序号";
	cout << setw(25) << "班级" << setw(20) << "书名";
	cout << setw(22) << "ISBN" << setw(10) << "数量";
	cout << endl;
	try
	{
		if (!file.fail())
		{
			for (auto i = 1; i <= record_num; i++)
			{
				memset(classname, '\0', detail_short);
				memset(bname, '\0', detail_short);
				memset(bisbn, '\0', detail_short);
				memset(num, '\0', value_size);
				file.read(classname, detail_short);
				file.read(bname, detail_short);
				file.read(bisbn, detail_short);
				file.read(num, value_size);
				if (rt_book)
					cout << setw(3) << i;
				cout << setw(27) << classname;
				cout << setw(22) << bname;
				cout << setw(20) << bisbn;
				cout << setw(10) << num;
				cout << endl;
				if (file.tellg() < 0)
					rt_book = false;
				else
					rt_book = true;
			}
		}
	}
	catch (...)
	{
		throw "file error ";
		file.close();
	}
	file.close();
	cin.ignore(INT_MAX, '\n');
	cout << "(任意键返回)" << endl;
	getchar();
}

void view_exit_record(void)
{
	long filelen;
	int record_num;
	bool rt_book = false;
	char classname[detail_short];
	char bname[detail_short];
	char bisbn[detail_short];
	char bnum[value_size];
	char bdamage[value_size];
	char bscrap_num[value_size];
	ifstream file;
	file.open("exitdata.bat", ios::binary | ios::in | ios::app);
	filelen = getfilelen(file);
	record_num = filelen / (detail_short * 3 + value_size * 3);
	if (record_num >= 1)
		rt_book = true;
	system("cls");
	cout << setw(5) << "序号";
	cout << setw(25) << "班级" << setw(20) << "书名";
	cout << setw(22) << "ISBN" << setw(10) << "归还数量";
	cout << setw(12) << "破损数量" << setw(10) << "报废数量";
	cout << endl;
	try
	{
		if (!file.fail())
		{
			for (auto i = 1; i <= record_num; i++)
			{
				memset(classname, '\0', detail_short);
				memset(bname, '\0', detail_short);
				memset(bisbn, '\0', detail_short);
				memset(bnum, '\0', value_size);
				memset(bdamage, '\0', value_size);
				memset(bscrap_num, '\0', value_size);
				file.read(classname, detail_short);
				file.read(bname, detail_short);
				file.read(bisbn, detail_short);
				file.read(bnum, value_size);
				file.read(bdamage, value_size);
				file.read(bscrap_num, value_size);
				if (rt_book)
					cout << setw(3) << i;
				cout << setw(27) << classname;
				cout << setw(22) << bname;
				cout << setw(20) << bisbn;
				cout << setw(10) << bnum;
				cout << setw(10) << bdamage;
				cout << setw(10) << bscrap_num;
				cout << endl;
				if (file.tellg() < 0)
					rt_book = false;
				else
					rt_book = true;
			}
		}
	}
	catch (...)
	{
		throw "file error ";
		file.close();
	}
	file.close();
	cin.ignore(INT_MAX, '\n');
	cout << "(任意键返回)" << endl;
	getchar();
}
#include <iostream>
#include <fstream>
#include <cstring>
#include <iomanip> 
#include <climits>
#include "book.h"
using namespace std;
void userdeal(int);
long getfilelen(ifstream & ifs);
void view_enter_record();
void view_exit_record();
void book_mean()
{
	cout << "                                                  " << endl;
	cout << "                  欢迎使用教材管理系统            " << endl;
	cout << "                                                  " << endl;
	cout << "      1.借出教材                        2.归还教材" << endl;
	cout << "      3.录入教材                        4.浏览全部" << endl;
	cout << "      5.删除教材                        6.出入记录" << endl;
	cout << "      7.破损教材                        8.报废教材" << endl;
	cout << "                                                  " << endl;
}

void exit_add_data()
{
	entry_exit_book add;
	char cname[detail_short] = { '\0' };
	char bname[detail_short] = { '\0' };
	char bisbn[detail_short] = { '\0' };
	char num[value_size] = { '\0' };
	cout << "请输入班级:" << endl;
	cin >> cname;
	add.set_class_name(cname);
	cout << "请输入书名:" << endl;
	cin >> bname;
	add.set_book_name(bname);
	cout << "请输入ISBN:" << endl;
	cin >> bisbn;
	add.set_book_isbn(bisbn);
	cout << "请输入数量:" << endl;
	cin >> num;
	add.set_enter_num(num);
	add.writr_enter_data();
	cin.ignore(INT_MAX, '\n');
	cout << "保存成功!!(任意键返回)" << endl;
	getchar();
}

void enter_add_data()
{
	entry_exit_book add;
	char cname[detail_short] = { '\0' };
	char bname[detail_short] = { '\0' };
	char bisbn[detail_short] = { '\0' };
	char num[value_size] = { '\0' };
	char bdamage[value_size] = { '\0' };
	char bscrap_num[value_size] = { '\0' };
	cout << "请输入班级:" << endl;
	cin >> cname;
	add.set_class_name(cname);
	cout << "请输入书名:" << endl;
	cin >> bname;
	add.set_book_name(bname);
	cout << "请输入ISBN:" << endl;
	cin >> bisbn;
	add.set_book_isbn(bisbn);
	cout << "请输入归还数量:" << endl;
	cin >> num;
	add.set_exit_num(num);
	cout << "请输入教材破损数量:" << endl;
	cin >> bdamage;
	add.set_book_damage(bdamage);
	cout << "请输入教材报废数量:" << endl;
	cin >> bscrap_num;
	add.set_book_scrap_num(bscrap_num);
	add.writr_exit_data();
	cin.ignore(INT_MAX, '\n');
	cout << "保存成功!!(任意键返回)" << endl;
	getchar();
}

void add_book(void)
{
	book_recycle add;
	char bname[detail_short] = { '\0' };
	char bisbn[detail_short] = { '\0' };
	char bauthor[detail_short] = { '\0' };
	char bsum[value_size] = { '\0' };
	char bavailable[value_size] = { '\0' };
	char bdamage[value_size] = { '\0' };
	char bscrap_num[value_size] = { '\0' };
	cout << "请输入书名:" << endl;
	cin >> bname;
	add.set_book_name(bname);
	cout << "请输入ISBN:" << endl;
	cin >> bisbn;
	add.set_book_isbn(bisbn);
	cout << "请输入作者:" << endl;
	cin >> bauthor;
	add.set_book_author(bauthor);
	cout << "请输入教材总数:" << endl;
	cin >> bsum;
	add.set_book_sum(bsum);
	cout << "请输入教材可用数量:" << endl;
	cin >> bavailable;
	add.set_book_available(bavailable);
	cout << "请输入教材破损数量:" << endl;
	cin >> bdamage;
	add.set_book_damage(bdamage);
	cout << "请输入教材报废数量:" << endl;
	cin >> bscrap_num;
	add.set_book_scrap_num(bscrap_num);
	add.book_enter();
	cin.ignore(INT_MAX, '\n');
	cout << "保存成功!!(任意键返回)" << endl;
	getchar();
}

void view_all_book(int num = 1)
{
	int page;
	int page_now = num;
	long filelen;
	int book_num;
	int page_num = 20;
	bool rt_book = false;
	char bname[detail_short];
	char bisbn[detail_short];
	char bauthor[detail_short];
	char bsum[value_size];
	char bavailable[value_size];
	char bdamage[value_size];
	char bscrap_num[value_size];
	ifstream file;
	file.open("book.bat", ios::binary | ios::in | ios::app);
	filelen = getfilelen(file);
	book_num = filelen / (detail_short * 3 + value_size * 4);
	if (book_num >= 1)
		rt_book = true;
	page = book_num / page_num + 1;
	system("cls");
	cout << setw(5) << "序号";
	cout << setw(25) << "书名" << setw(20) << "ISBN";
	cout << setw(22) << "作者" << setw(10) << "总数量";
	cout << setw(10) << "可用数" << setw(10) << "破损数" << setw(10) << "报废数";
	cout << endl;
	try
	{
		file.seekg((page_now - 1)*page_num*(detail_short * 3 + value_size * 4), ios::beg);
		if (!file.fail())
		{
			for (auto i = 1; i <= page_num && i <= book_num ;i++)
			{
				memset(bname, '\0', detail_short);
				memset(bisbn, '\0', detail_short);
				memset(bauthor, '\0', detail_short);
				memset(bsum, '\0', value_size);
				memset(bavailable, '\0', value_size);
				memset(bdamage, '\0', value_size);
				memset(bscrap_num, '\0', value_size);
				if (rt_book)
					cout << setw(3) << ((page_now - 1) * 20 + i);
				file.read(bname, detail_short);
				file.read(bisbn, detail_short);
				file.read(bauthor, detail_short);
				file.read(bsum, value_size);
				file.read(bavailable, value_size);
				file.read(bdamage, value_size);
				file.read(bscrap_num, value_size);
				cout << setw(27) << bname;
				cout << setw(20) << bisbn;
				cout << setw(22) << bauthor;
				cout << setw(10) << bsum;
				cout << setw(10) << bavailable;
				cout << setw(10) << bdamage;
				cout << setw(10) << bscrap_num;
				cout << endl;
				if (file.tellg()<0)
					rt_book = false;
				else
					rt_book = true;
			}
			cout << '\n' << setw(100) << "第" << page_now << "页" << "    ";
			cout << "共" << page << "页" << endl;
		}
	}
	catch (...)
	{
		throw "file error ";
		file.close();
	}
	if (page_now<page)
	{
		page_now = page_now + 1;
		userdeal(page_now);
	}
	else if (page_now = page)
	{
		cout << "最后一页了!" << endl;
		userdeal(page_now);
	}
	else
	{
		userdeal(page_now);
	}
	file.close();
}

void del_book(void)
{
	int num;
	view_all_book();
	cout << "请输入教材的序号:" << endl;
	cin >> num;
	book_recycle temp;
	temp.deldata(num);
	cin.ignore(INT_MAX, '\n');
	cout << "删除完成(任意键返回)" << endl;
	getchar();
}

void view_recorder()
{
	  int num;
	  cout << "\n      1 借书记录                2 归还记录\n";
	  cout << "请输入序号:" << endl;

	  cin >> num;
	  if (num == 1)
		  view_enter_record();
	  if (num == 2)
		  view_exit_record();
}

void view_damage_book(void)
{
	long filelen;
	int book_num;
	bool rt_book = false;
	char bname[detail_short];
	char bisbn[detail_short];
	char bauthor[detail_short];
	char bsum[value_size];
	char bavailable[value_size];
	char bdamage[value_size];
	char bscrap_num[value_size]; 
	ifstream file;
	file.open("book.bat", ios::binary | ios::in | ios::app);
	filelen = getfilelen(file);
	book_num = filelen / (detail_short * 3 + value_size * 4);
	if (book_num >= 1)
		rt_book = true;
	system("cls");
	cout << setw(5) << "序号";
	cout << setw(25) << "书名" << setw(20) << "ISBN";
	cout << setw(22) << "作者" << setw(10) << "总数量";
	cout << setw(10) << "破损数" << endl;
	try
	{
		if (!file.fail())
		{
			for (auto i = 1; i <= book_num; i++)
			{
				memset(bname, '\0', detail_short);
				memset(bisbn, '\0', detail_short);
				memset(bauthor, '\0', detail_short);
				memset(bsum, '\0', value_size);
				memset(bavailable, '\0', value_size);
				memset(bdamage, '\0', value_size);
				memset(bscrap_num, '\0', value_size);
				file.read(bname, detail_short);
				file.read(bisbn, detail_short);
				file.read(bauthor, detail_short);
				file.read(bsum, value_size);
				file.read(bavailable, value_size);
				file.read(bdamage, value_size);
				file.read(bscrap_num, value_size);
				if (*bscrap_num > '0')
				{
					if (rt_book)
						cout << setw(3) << i;
					cout << setw(27) << bname;
					cout << setw(20) << bisbn;
					cout << setw(22) << bauthor;
					cout << setw(10) << bsum;
					cout << setw(10) << bdamage;
					cout << endl;
				}
				if (file.tellg() < 0)
					rt_book = false;
				else
					rt_book = true;
			}
		}
	}
	catch (...)
	{
		throw "file error ";
		file.close();
	}
	file.close();
	cin.ignore(INT_MAX, '\n');
	cout << "(任意键返回)" << endl;
	getchar();
}

void view_scrap_book(void)
{
	long filelen;
	int book_num;
	bool rt_book = false;
	char bname[detail_short];
	char bisbn[detail_short];
	char bauthor[detail_short];
	char bsum[value_size];
	char bavailable[value_size];
	char bdamage[value_size];
	char bscrap_num[value_size];
	ifstream file;
	file.open("book.bat", ios::binary | ios::in | ios::app);
	filelen = getfilelen(file);
	book_num = filelen / (detail_short * 3 + value_size * 4);
	if (book_num >= 1)
		rt_book = true;
	system("cls");
	cout << setw(5) << "序号";
	cout << setw(25) << "书名" << setw(20) << "ISBN";
	cout << setw(22) << "作者" << setw(10) << "总数量";
	cout << setw(10) << "报废数" << endl;
	try
	{
		if (!file.fail())
		{
			for (auto i = 1; i <= book_num; i++)
			{
				memset(bname, '\0', detail_short);
				memset(bisbn, '\0', detail_short);
				memset(bauthor, '\0', detail_short);
				memset(bsum, '\0', value_size);
				memset(bavailable, '\0', value_size);
				memset(bdamage, '\0', value_size);
				memset(bscrap_num, '\0', value_size);
				file.read(bname, detail_short);
				file.read(bisbn, detail_short);
				file.read(bauthor, detail_short);
				file.read(bsum, value_size);
				file.read(bavailable, value_size);
				file.read(bdamage, value_size);
				file.read(bscrap_num, value_size);
				if (*bscrap_num > '0')
				{
					if (rt_book)
						cout << setw(3) << i;
					cout << setw(27) << bname;
					cout << setw(20) << bisbn;
					cout << setw(22) << bauthor;
					cout << setw(10) << bsum;
					cout << setw(10) << bscrap_num;
					cout << endl;
				}
				if (file.tellg() < 0)
					rt_book = false;
				else
					rt_book = true;
			}
		}
	}
	catch (...)
	{
		throw "file error ";
		file.close();
	}
	file.close();
	cin.ignore(INT_MAX, '\n');
	cout << "(任意键返回)" << endl;
	getchar();
}

int main(void)
{
	int function;
	book_mean();
	while (1)
	{
		cout << "请输入选择的序号(0退出):" << endl;
		cin >> function;
		switch (function)
		{
		case 1:
			system("cls");
			exit_add_data();
			system("cls");
			book_mean();
			break;
		case 2:
			system("cls");
			enter_add_data();
			system("cls");
			book_mean();
			break;
		case 3:
			system("cls");
			add_book();
			system("cls");
			book_mean();
			break;
		case 4:
			view_all_book();
			system("cls");
			book_mean();
			break;
		case 5:
			del_book();
			system("cls");
			book_mean();
			break;
		case 6:
			system("cls");
			view_recorder();
			system("cls");
			book_mean();
			break;
		case 7:
			view_damage_book();
			system("cls");
			book_mean();
			break;
		case 8:
			view_scrap_book();
			system("cls");
			book_mean();
			break;
		case 0:
			return 0;
			break;
		default:
			cout << "输入有误" << endl;
			break;
		}
	}
	return 0;
}



猜你喜欢

转载自blog.csdn.net/weixin_41175930/article/details/80556850