/*2. 设计一个管理图书的简单程序,提供的基本功能包括:
可连续将新书存入文件“book.dat”中,新书信息加入到文件的尾部;
也可以根据输入的书名进行查找;把文件“book.dat”中同书名的所有书显示出来。
为简单起见,描述一本书的信息包括:书号,书名,出版社和作者*/
#include <iostream>
#include <string>
#include <fstream>
#include <cstring>
using namespace std;
class Book
{
private:
int booknum;
char bookname[20];
char publish[20];
char author[10];
public:
void setbooknum()
{
cin >> booknum;
}
void setbookname()
{
cin >> bookname;
}
void setpublish()
{
cin >> publish;
}
void setauthor()
{
cin >> author ;
}
int getbooknum()
{
return booknum;
}
string getbookname()
{
return bookname;
}
string getpublish()
{
return publish;
}
string getauthor()
{
return author;
}
void inputbook();
void searchbook();
void showsamebook();
Book(){};
~Book(){};
};
void Book::inputbook()
{
fstream bookdata("C:\\Users\\HP\\Desktop\\aha\\C++\\experiment4.2\\book7.dat", ios::out | ios::binary | ios::app);
Book book;
cout << "请录入书籍的基本信息:" <<endl;
cout << "书号:" ;
book.setbooknum();
cout << "书名:" ;
book.setbookname();
cout << "出版社:" ;
book.setpublish();
cout << "作者:" ;
book.setauthor();
bookdata.write((char* )&book,sizeof(book));
bookdata.close();
}
void Book::searchbook()
{
char name[20];
Book book1;
int flag = 0;
fstream bookdata1("C:\\Users\\HP\\Desktop\\aha\\C++\\experiment4.2\\book7.dat", ios::in | ios::binary);
cout << "请输入你要找的书的名字:"<<endl;
cin >> name;
while(bookdata1.read((char *)&book1,sizeof(book1)))
{
int tmp = strcmp(name,book1.getbookname().c_str());
if(tmp ==0)
{
cout << "书号:" << book1.getbooknum() << "书名:" << book1.getbookname() << "出版社:" << book1.getpublish() << "作者:" << book1.getauthor() << endl;
flag++;
}
}
if(flag ==0)
{
cout << "未找到你需要的书。"<< endl;
}
bookdata1.close();
}
void Book::showsamebook()
{
int flag1=0;//每次检索是第几本书
int flag2=0;//第几书的中间变量
int flag3=0;//标记第一本不同的书
int flag4=0;//每次检索的指针位置
fstream bookdata2("C:\\Users\\HP\\Desktop\\aha\\C++\\experiment4.2\\book7.dat",ios::in|ios::binary);
fstream bookdata3("C:\\Users\\HP\\Desktop\\aha\\C++\\experiment4.2\\book7.dat",ios::in|ios::binary);
Book book2;
Book book3;
while(bookdata2.read((char *)&book2,sizeof(book2)))
{
flag1 = flag2;
while(bookdata3.read((char *)&book3,sizeof(book3)))
{
int temp = strcmp(book2.getbookname().c_str(),book3.getbookname().c_str());
if(temp == 0)
{
//cout << "书号:" << book2.getbooknum() << "书名:" << book2.getbookname() << endl;
cout << "书号:" << book3.getbooknum() << "书名:" << book3.getbookname() << endl;
}
else if(flag3 == 0)
{
flag2 = flag1;
flag4 = flag2 * sizeof(book3);
flag3 = 1;//第二本不一样的书不需要标记
}
flag1++;
}
if(flag3 == 0)//如果书的名字都一样那么退出检索
{
break;
}
bookdata3.close();
bookdata3.open("C:\\Users\\HP\\Desktop\\aha\\C++\\experiment4.2\\book7.dat", ios_base::in | ios_base::binary);
flag3=0;//是为了只标记第一本不同的书
bookdata2.seekg((flag4 + sizeof(book3)),ios::beg);//将其指针放到data3的后面
bookdata3.seekg(flag4,ios::beg);//将其指针放到不同的那本书的地方
}
bookdata2.close();
bookdata3.close();
}
int main()
{
Book book4;
int a;
while(1)
{
cout << "*****简易的图书管理系统*****" <<endl;
cout << " 添加书籍请输入1" << endl;
cout << " 查找书籍请输入2" << endl;
cout << " 查找名字相同的书籍请输入3" << endl;
cout << " 结束程序请输入4" << endl;
cin >> a;
switch(a)
{
case 1:book4.inputbook();
break;
case 2:book4.searchbook();
break;
case 3:book4.showsamebook();
break;
case 4:
return 0;
}
}
return 0;
}
注意:
1.两个函数打开同一个文件不是用同一个文件指针;
2.用while(bookdata3.read((char *)&book3,sizeof(book3)))读取文件 ,在读完的时候read函数会返回EOF,文件指针会丢失,所以需要重新打开一次来重新链接一下;