/*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,文件指针会丢失,所以需要重新打开一次来重新链接一下;