Ejercicio
Base de datos de amigos, utilizando archivos
Objetivo
Expanda la "base de datos de amigos", de modo que cargue los datos del archivo al comienzo de cada sesión (si el archivo existe) y guarde los datos en el archivo cuando finalice la sesión. Por lo tanto, los datos introducidos en una sesión deben estar disponibles para la siguiente sesión.
Código
Imports System
Imports System.IO
Public Class FriendsDatabase
Structure people
Public name As String
Public email As String
Public address As String
Public year As UShort
End Structure
Public Shared Sub Main()
Dim total As Integer = 275
Dim p As people() = New people(total - 1) {}
Dim amount As Integer = 0
Dim [option] As Char
Dim found As Boolean
Dim textSearch As String
Dim name As String = "friends.dat"
If File.Exists(name) Then
Dim file As StreamReader = File.OpenText(name)
amount = Convert.ToInt32(file.ReadLine())
file.ReadLine()
For i As Integer = 0 To amount - 1
If i < total Then
p(i).name = file.ReadLine()
p(i).email = file.ReadLine()
p(i).address = file.ReadLine()
p(i).year = Convert.ToUInt16(file.ReadLine())
file.ReadLine()
End If
Next
file.Close()
End If
Do
Console.WriteLine("1- Add data")
Console.WriteLine("2- Show")
Console.WriteLine("3- View all data")
Console.WriteLine("4- Show between dates")
Console.WriteLine("5- Show oldest")
Console.WriteLine("6- Show fields match")
Console.WriteLine("0- Exit")
Console.Write("Enter a option: ")
[option] = Convert.ToChar(Console.ReadLine())
Select Case [option]
Case "1"c
If amount < total - 1 Then
Do
Console.Write("Name: ")
p(amount).name = Console.ReadLine()
If p(amount).name.Length > 40 Then Console.WriteLine("Max 40 letters")
Loop While p(amount).name.Length > 40
Do
Console.Write("Email: ")
p(amount).email = Console.ReadLine()
If p(amount).email.Length > 30 Then Console.WriteLine("Max 30 letters")
Loop While p(amount).email.Length > 30
Do
Console.Write("Address: ")
p(amount).address = Console.ReadLine()
If p(amount).address.Length > 150 Then Console.WriteLine("Max 150 letters")
Loop While p(amount).address.Length > 150
Do
Console.Write("Year: ")
p(amount).year = Convert.ToUInt16(Console.ReadLine())
If p(amount).year < 1850 OrElse p(amount).year > 2100 Then Console.WriteLine("1850-2100")
Loop While p(amount).year < 1850 OrElse p(amount).year > 2100
amount += 1
Console.WriteLine()
Else
Console.WriteLine("Full")
End If
Case "2"c
If amount = 0 Then
Console.WriteLine("No data")
Else
For i As Integer = 0 To amount - 1
If p(i).name.Length <= 30 Then
Console.WriteLine("{0}: Name = {1}", i + 1, p(i).name)
Else
Console.WriteLine("{0}: Name = {1}", i + 1, p(i).name.Substring(0, 30) & "...")
End If
If i Mod 20 = 19 Then Console.ReadLine()
Next
End If
Case "3"c
Console.Write("Enter the person: ")
textSearch = Console.ReadLine()
found = False
For i As Integer = 0 To amount - 1
If textSearch.ToLower() = p(i).name.ToLower() Then
found = True
Console.WriteLine("{0}: Year = {1}, Email = {2}, Address = {3}", i + 1, p(i).year, p(i).email, p(i).address)
End If
Next
If Not found Then Console.WriteLine("Not exists")
Case "4"c
Console.Write("Enter the first year: ")
Dim year1 As Integer = Convert.ToUInt16(Console.ReadLine())
Console.Write("Enter the second year: ")
Dim year2 As Integer = Convert.ToUInt16(Console.ReadLine())
If year1 > year2 Then
Dim aux As Integer = year2
year2 = year1
year1 = aux
End If
found = False
For i As Integer = 0 To amount - 1
If p(i).year >= year1 AndAlso p(i).year <= year2 Then
Console.Write(p(i).name & " - ")
found = True
End If
Next
If Not found Then Console.WriteLine("Not found")
Case "5"c
If amount = 0 Then
Console.WriteLine("No data")
Else
Dim firstYear As Integer = p(0).year
found = False
For i As Integer = 1 To amount - 1
If p(i).year < firstYear Then firstYear = p(i).year
Next
For i As Integer = 0 To amount - 1
Console.WriteLine("{0}: Address = {2}, Year = {3}", i + 1, p(i).name, p(i).address, p(i).year)
If Console.ReadLine().ToLower() = "end" Then Exit For
Next
End If
Case "0"c
Case Else
Console.WriteLine("Wrong option")
End Select
Loop While [option] <> "0"c
Dim dataFile As StreamWriter = File.CreateText(name)
dataFile.WriteLine(amount)
dataFile.WriteLine()
For i As Integer = 0 To amount - 1
dataFile.WriteLine(p(i).name)
dataFile.WriteLine(p(i).email)
dataFile.WriteLine(p(i).address)
dataFile.WriteLine(p(i).year)
dataFile.WriteLine()
Next
dataFile.Close()
End Sub
End Class