为什么这个基于文件的登录程序挂起?

时间:2017-10-18 16:59:20

标签: c++ infinite-loop fstream

  1. 为什么登录后此代码会挂起(选项1,然后输入用户名和密码)?
  2. 我是否需要同时包含fstreamiostream
  3. #include<fstream>
    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<conio.h>
    #include<process.h>
    #include<stdlib.h>
    using namespace std;
    
    class Admin
    {
        char Uname[20];
        char Pass[20];
    public:
        Admin()
        {
            strcpy(Uname,"Null");
            strcpy(Pass,"Null");
        }
        Admin(int)
        {
            strcpy(Uname,"Aha");
            strcpy(Pass,"you345");
        }
        Admin(char)
        {
            strcpy(Uname,"Mahi");
            strcpy(Pass,"852963");
        }
        char* GetUname()
        {return Uname;}
        char* GetPass()
        {return Pass;}
    };
    
    int Adchecker()
    {
        fstream F("Admin.dat",ios::binary);
        Admin A,B(1),C('A');          // different data via overloads above
        F.write((char*)&B,sizeof(B)); // so that the file admin has something
        F.write((char*)&C,sizeof(C));
        char U[20],P[20];
        cout<<"\nEnter Username:";
        cin>>U;
        int z=0;                      // return flag
        cout<<"\nEnter Password:";
        cin>>P;
        F.write((char*)&A,sizeof(A));
        F.seekg(0,ios::beg);
        while(!F.eof())
        {
            F.read((char*)&A,sizeof(A));
            if(strcmp(A.GetUname(),U)==0)
            {
                z=2;
                if(strcmp(A.GetPass(),P)==0)
                {
                    z=5;
                    break;
                }
                else
                    break;
            }
    
        }
        return z;
        F.close();
    }
    
    int main()
    {
        int B=0;
        int c=4,i=0;
        char A='y';
        char status[20];
        ofstream F("Log.txt",ios::app);
        cout<<"\n\t\t\tWELCOME TO.......\n ~~~***This place!!!***~~~ ";
        while(A=='y'||A=='Y')
        {
            cout<<"\nAre you an...\n1.Admin\n2.Customer(1/2)???";
            cin>>B;
            switch(B)
            {
            case 1:
                    while(c!=5)
                    {
                        c=Adchecker();
                        i++;
                        if(c==5)
                        {
                            i=0;
                            cout<<"Welcome sire :3";
                            break;
                        }
                        if(c==2)
                        {
                            cout<<"Your password is wrong...\nYou have "<<(3-i)<<"chances left";
                        }
                        if(c==0)
                        {
                            cout<<"Your Username is incorrect..\nYou have "<<(3-i)<<"chances left";
                        }
                        if(i==3)
                        {
                            cout<"Nope";
                            exit(0);
                        }
    
                    }
                    break;
            case 2:
                cout<<"\nLater, customer :p\n";
                break;
            default:
                cout<<"good bye";
                exit(0);
            }
            cout<<"Again(Y/n)?)";
            cin>>A;
        }
        return 0;
    }
    

1 个答案:

答案 0 :(得分:0)

  1. construct fstream just ios::binary作为模式无效。由于您没有错误检查,因此从未打开的文件读取的循环不会终止。 (供参考,正确循环doesn't involve eof。)
  2. 是; #include<fstream>需要std::fstream#include<iostream>和朋友需要std::cout