Когда я пытаюсь войти в созданную учетную запись, iy не распознает имя пользователя, почему это?

#vb.net

#vb.net

Вопрос:

 Module Module1
    Dim database As New Dictionary(Of String, String)
    Dim ulist As New List(Of String)
    Dim plist As New List(Of String)
    Dim newname As String
    Dim passw As String
    Sub main()
        menu() '
    End Sub
    Sub menu()
        Console.WriteLine("type 1, 2 or 3")
        Console.WriteLine("1 : create a new account")
        Console.WriteLine("2: log in ")
        Console.WriteLine("3 : quit program")
        Dim choice As String
        choice = Console.ReadLine()
        If choice = "1" Then
            create()
        ElseIf choice = "2" Then
            login()
        ElseIf choice = "3" Then
            Console.WriteLine("quitting...")
            Console.Clear()
        End If
    End Sub
    Sub login()
        Dim unamever As String
        Dim passwvari
        Dim veri3 As Boolean = False
        While veri3 = False
            Console.WriteLine("please enter you username")
            unamever = Console.ReadLine()
            If ulist.Contains(unamever) Then
                Console.WriteLine("please enter your password : ")
                passwvari = Console.ReadLine()
                If plist.Contains(passwvari) Then
                    Console.WriteLine("logging you in...")
                    veri3 = True
                Else
                    Console.WriteLine("password incorrect try again")
                    veri3 = False
                End If
            Else
                Console.WriteLine("username not registered try again")
                veri3 = False
            End If
        End While



    End Sub
    Sub create()
        Dim veri As Boolean = False
        Dim attempts As Integer = 1
        Do Until veri = True
            Console.WriteLine("enter a new username")
            newname = Console.ReadLine()
            If ulist.Contains(newname) Then
                Console.WriteLine("that username is already taken, try again")
                attempts = attempts   1
                veri = False
            Else
                ulist.Add(newname)
                Console.WriteLine("your new username has been stored")
                notused()
                veri = True
                database.Add(newname, passw)
                Console.WriteLine("succes you have made an account you username :" amp; newname amp; " and password: " amp; passw)
                FileOpen(1, "C:UsersiivixOneDriveDocumentsA LEVELpassws.txt", OpenMode.Output)
                PrintLine(1, newname amp; passw)
            End If
            If attempts > 4 Then
                Console.WriteLine("you have had more than 3 tries, BYE")
                Console.Clear()
            End If
        Loop

    End Sub
    Sub notused()
        Dim veri2 As Boolean = False
        While veri2 = False
            Console.WriteLine("create a password " amp; newname)
            passw = Console.ReadLine
            Dim passwlen = Len(passw)
            If passwlen > 12 Then
                Console.WriteLine("your password has been stored ")
                plist.Add(passw)
                veri2 = True
            Else
                Console.WriteLine("try again password must be greater than 12 characters")
                veri2 = False
            End If


        End While


    End Sub

End Module
 

Этот код предназначен для системы входа в систему, я новичок в vb, и пока это мой код, я столкнулся с проблемой: почему имена пользователей не сохраняются, когда я пытаюсь войти в систему позже, как я могу это исправить? Я хочу, чтобы пользователь мог снова войти в учетную запись, когда она будет создана другая проблема при записи имен пользователей и паролей в текстовый файл новое имя пользователя перезаписывает последнее, я хочу, чтобы имена пользователей были последовательно перечислены вместе с паролями ‘

  • Кстати, это не домашнее задание, это задача для начинающих программистов

Комментарии:

1. VBA, vb.net и VB6 — это не одно и то же, пожалуйста, не добавляйте нерелевантные теги.

2. Поскольку это похоже на ваше домашнее задание, я укажу вам направление, а не дам вам ответ — 1. Вы не загружаете имена пользователей / пароли из файла перед проверкой. 2. При сохранении имен пользователей / паролей вы делаете так, чтобы было невозможно идентифицировать каждую часть

3. Также имейте в виду символьный корпус

4. Похоже, что любой пароль в текстовом файле приемлем для любого имени пользователя. Разве вам не нужен пароль, соответствующий имени пользователя?

Ответ №1:

Я обновил ваш код, чтобы использовать методы .net, а не устаревшие методы VB6. Я создал LoginPath переменную уровня модуля, чтобы ее можно было увидеть во всех моих методах в модуле. Я использую a Dictionary , а не ваши 2 List(Of String) s. Таким образом, имя пользователя является ключом, а пароль — значением. Поиск по словарю происходит очень быстро.

Первое, что нужно сделать, это прочитать файл и заполнить словарь. Если файл еще не существует, пользователь информируется.

Метод Create немного меняется при использовании словаря. Я использовал File класс .net для записи в текстовый файл.

 File.AppendAllLines(LoginPath, {$"{newname},{passw}"})
 

Это очень умный метод. Если файл не существует, он создает его. Он открывает файл, записывает в файл и закрывает его. Первый параметр — это путь. Второй параметр — это то, что нужно записать в файл, массив строк. Обратите внимание, что имена методов заканчиваются на AllLines, множественное число. Внешние фигурные скобки указывают, что это массив. Наш массив имеет только один элемент. Я использовал интерполированную строку, указанную $ предыдущей строкой. Затем мы можем вставить переменные непосредственно в строку, заключенную в фигурные скобки. Запятая — это литерал в строке. Мы используем запятую в качестве разделителя, когда строка разделяется на имя и пароль.

 Private LoginPath As String = "C:UsersiivixOneDriveDocumentsA LEVELpassws.txt"
Private LoginDict As New Dictionary(Of String, String)

Sub Main()
    ReadLoginFileAndFillDictionary()
    menu()
    Console.ReadKey()
End Sub
Private Sub Menu() 'Names of Subs, Functions etc. should begin with capital letters
    Console.WriteLine("type 1, 2 or 3")
    Console.WriteLine("1 : create a new account")
    Console.WriteLine("2: log in ")
    Console.WriteLine("3 : quit program")
    Dim choice As String
    choice = Console.ReadLine()
    If choice = "1" Then
        Create()
    ElseIf choice = "2" Then
        Login()
    ElseIf choice = "3" Then
        Console.WriteLine("quitting...")
        Environment.Exit(0)
    End If
End Sub

Private Sub Create()
    Dim veri As Boolean 'Default value is False, value types initialize automatically
    Dim attempts As Integer
    Dim newname As String = ""
    Dim passw As String = ""
    Do Until veri = True
        Console.WriteLine("enter a new username")
        newname = Console.ReadLine()
        If LoginDict.ContainsKey(newname) Then 'Searches the Keys in the Dictionary and returns True or False
            Console.WriteLine("that username is already taken, try again")
            attempts  = 1 'new syntax for updating the value of a variable, saves a bit of typing
        Else
            veri = True
        End If
        If attempts > 4 Then
            Console.WriteLine("you have had more than 3 tries, BYE")
            Console.Clear()
            Environment.Exit(0) 'To end the application
        End If
    Loop
    veri = False 'You can use the same variable just reset its value
    While veri = False
        Console.WriteLine("create a password " amp; newname)
        passw = Console.ReadLine
        Dim passwlen = passw.Length 'Don't use the old VB6 Len
        If passwlen > 12 Then
            LoginDict.Add(newname, passw) 'Here is where the new user is added to the Dictionary
            veri = True
        Else
            Console.WriteLine("try again, password must be greater than 12 characters")
        End If
    End While
    Console.WriteLine("your new username and password have been stored")
    Console.WriteLine("succes, you have made an account your username :" amp; newname amp; " and password: " amp; passw)
    File.AppendAllLines(LoginPath, {$"{newname},{passw}"}) 'Adds the new user to the text file
End Sub

Private Sub Login()
    Dim unamever As String = ""
    Dim passwvari As String = ""
    Dim veri As Boolean 'You don't need a different name for a variable in a another method.
    While veri = False
        Console.WriteLine("please enter you username")
        unamever = Console.ReadLine()
        If LoginDict.ContainsKey(unamever) Then 'Searches the Keys in the Dictionary and returns True or False
            passwvari = LoginDict(unamever) 'Gets the value associated with the username
            Console.WriteLine("please enter your password : ")
            If passwvari = Console.ReadLine Then 'Compares the value found in the Dictionary to the string entered by the user.
                Console.WriteLine("logging you in...")
                veri = True
            Else
                Console.WriteLine("password incorrect, try again")
            End If
        Else
            Console.WriteLine("username not registered, try again")
        End If
    End While
End Sub

Private Sub ReadLoginFileAndFillDictionary()
    If File.Exists(LoginPath) Then
        Dim lines = File.ReadAllLines(LoginPath) 'Read the file into an array of lines
        For Each line In lines
            Dim splits = line.Split(","c) 'Split each line by the comma into an array of 2 strings
            LoginDict.Add(splits(0), splits(1)) 'The first element is the username and the second element is the password.
        Next
    Else
        Console.WriteLine("There are currently no registered users. Please begin with Option 1.")
    End If
End Sub
 

В реальном приложении вы НИКОГДА не будете хранить пароли в виде обычного текста.

Комментарии:

1. файл не объявлен

2. @kylegreene234 Добавьте Imports System.IO в верхней части файла кода. Именно там находится класс File.