Как проверить, существует ли запись в c ++ (обработка файла данных)?

0

Я пытаюсь проверить, имеет ли пользователь действительный номер учетной записи и пароль (оба являются целыми) в C++. Данные хранятся в файле.dat с использованием структуры. Это то, что я еще пробовал:

void printIntroMenu();
void printMainMenu();
void start();
void login();
void createAccount();

char menuInput;
int i=0;
struct user{
int user_id;
int password;
}u;


int main()
{
start();

return 0;
}

void start()
{
cout<<"\n\n";
cout<<setw(60)<<" Please select an option from the menu below:";
printIntroMenu();
cin>>menuInput;
switch(menuInput)
{
     case 'l': login();
     break;
     case 'c': createAccount();
     break;
     case 'q': exit(0);
     break;
     default: cout<<"\n\n Wrong Choice!! Valid choices are l,c or q.";
     start();
}
}
void createAccount()
{
ofstream fout;
fout.open("abc.dat",ios::app|ios::binary);
cout<<setw(60)<<"\n\n Please enter your username (Integer only)";
cin>>u.user_id;
cout<<setw(60)<<"\n\n Please enter your password (Integer only)";
cin>>u.password;
fout<<u.user_id<<'\n'<<u.password<<'\n';
fout.close();
cout<<setw(60)<<"\n Thank You!! Your Account Has Been Successfully Created.";
start();
}
void login()
{
int flag=0;
 int uid;
 int pass;
ifstream fin("abc.dat",ios::in | ios::binary);
cout<<setw(50)<<"Enter your username: ";
cin>>uid;
cout<<setw(50)<<"Enter your password: ";
cin>>pass;
while(!fin.eof())
{
    fin.read((char*)&u,sizeof(user));
    if(u.user_id==uid && u.password==pass)
    {
        flag=1;
        cout<<"\n Login Successful!!";
    }
    else{
        cout<<setw(60)<<"*************** LOGIN FAILED! ***************";
    start();
    }
}

}

Независимо от того, что я вводил в качестве входа в меню входа в систему, я всегда получаю вход с ошибкой в качестве вывода. Скажите, пожалуйста, какие-либо проблемы в структуре хранения данных или извлечения данных из файла или есть что-то, что мне не хватает в коде.

Теги:
iostream

2 ответа

1
Лучший ответ

Вы забыли строку для преобразования чисел, потому что это

fin.read((char*)&u,sizeof(user));

не получит вас, что вы хотите, он получает числа из файла в формате char *, а не int.

Это должно быть сделано следующим образом:

fin >> u.user_id;
fin >> u.password;
  • 0
    Спасибо. Понял. Я заменил его на 'fin >> uid;' и 'fin >> pass;'. Теперь код работает нормально.
  • 0
    Рад, что это работает, я колебался на секунду от моего собственного ответа)
0

У вас также должен быть флаг. Если запись отсутствует в первом месте, это может привести к ошибке входа в систему, но запись может существовать во втором месте. Поэтому сохраните переменную флага. Если переменная флага не была обновлена после прохождения по всему файлу, распечатайте "login failed".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню