Я не могу прочитать из файлов, чтобы подтвердить имя пользователя - PullRequest
0 голосов
/ 12 апреля 2019

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

Soo. Я сделал кое-что из того, что понял. Вот что я получил сейчас: НО, теперь он не будет записывать новое имя пользователя в файл Usernames_and_passwords. я невероятно смущен ...

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string>
#include <fstream>

using namespace std;

string user_input;
string birth_year;
string user_age;
string current_user_profile, current_user_password;
string username, password;
string newprofile;
string makenewusername, makenewpassword;

void TalkToAi() { //VOID TALKTOAI
    while (true) {
        cout << "write something: ";
        cin >> user_input;
            transform(user_input.begin(), user_input.end(), user_input.begin(), ::tolower); //TRANSLATES ALL UPPERCASE LETTERS TO LOWER CASE SO THE SYSTEM CAN UNDERSTAND!
        cout << user_input << "\n"; //###FOR TESTING PORPOSES!!!###

        //IF LIBRARY!

        if (user_input == "what's my age?" || user_input == "count my age" || user_input == "whats my age?") {
            //###CONTINUE HERE!!!###
        }

    }
}

void StartUp() { //VOID UPONSTARTUP (WHAT TO DO, ALSO READS DIFFRENT PROFILES AND PASSWORDS FOR LOGIN)
    cout << "what profile should i load?" << "\n" << "profile name: ";
    cin >> current_user_profile;

    fstream Myfile;
    Myfile.open("Usernames_and_passwords.txt");

    if (Myfile.is_open()) {
        while (getline (Myfile, username) ) {
            if (username == current_user_profile) {
                cout << "\n" << "Hello, " << username << "\n";
                break;
                }
                }
        if (username != current_user_profile) {
            cout << "wrong username or username unfortunately not found.\n";
            cout << "shall i create a new profile? Yes/No: ";
            cin >> newprofile;
            if (newprofile == "Yes" || newprofile == "yes") {
                cout << "new profile username: ";
                cin >> makenewusername;
                Myfile << makenewusername << endl;
            }
        }
    }
}

1 Ответ

0 голосов
/ 12 апреля 2019

Он не будет записывать в файл, потому что, как только вы закончите чтение файла с помощью getline (), будет установлен флаг eof.Вам нужно открыть файл, используя:

Myfile.open("Usernames_and_passwords.txt",fstream::in | fstream::out | fstream::app);

Это говорит программе, чтобы открыть файл для чтения и записи.fstream :: app сообщает программе добавить текст в конец файла.

Затем, чтобы выполнить сброс после нажатия eof, вы можете сделать

Myfile.clear();
Myfile.seekg(0, ios::beg);  

. Это очистит флаг eof и переместит указатель назад в начало файла.После этого вы можете записать в файл.

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

Вот модифицированная версия вашей функции:

void StartUp() { //VOID UPONSTARTUP (WHAT TO DO, ALSO READS DIFFRENT PROFILES AND PASSWORDS FOR LOGIN)
    cout << "what profile should i load?" << "\n" << "profile name: ";
    cin >> current_user_profile;

    fstream Myfile; 
    Myfile.open("Usernames_and_passwords.txt",fstream::in | fstream::out | fstream::app);   

    if (Myfile.is_open()) {
        while (getline (Myfile, username) ) {
            if (username == current_user_profile) {
                cout << "\n" << "Hello, " << username << "\n";
                return;
                }
        }

        cout << "wrong username or username unfortunately not found.\n";
        cout << "shall i create a new profile? Yes/No: ";
        cin >> newprofile;
        if (newprofile == "Yes") {
            cout << "new profile username: ";
            cin >> makenewusername;         
            Myfile.clear();
            Myfile.seekg(0, ios::beg);                  
            Myfile << makenewusername << endl;  
        }   
    }
}

Я бы также предложил, чтобы StartUp возвращал логическое значение при успешном завершении операции, поэтому вы можете решить прекратитьпрограмма.Например, если пользователь ввел «Нет».

...