#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.