I/O流4.2

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

猜你喜欢

转载自blog.csdn.net/qq_38053395/article/details/80184990