Base de datos de amigos, utilizando archivos Aprende programación con ejercicios Visual Basic (VB.net)

Lección:

Administración de Archivos


Ejercicio:

Base de datos de amigos, utilizando archivos 68


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