Jump to content

Escrever txt pela array


elrey
Go to solution Solved by elrey,

Recommended Posts

Boas,

Tenho aqui uma dúvida/problema em que ainda não consegui resolver.

Quando abro o programa, leio o que está no ficheiro neste caso "alunos.txt" e passa para a array, até aqui tudo certo.

Mas quando adiciono um registo novo na array e quero guardar no ficheiro dá erro.

Tenho o seguinte código:

Dim escrever As IO.StreamWriter
    If IO.File.Exists("alunos.txt") = True Then
        escrever = New IO.StreamWriter("alunos.txt", False) <-- Meti false, para reescrever tudo o que está na array para o ficheiro.
        For i = 0 To max
            escrever.Write(
                    arr(i).setnome & "|" &
                    arr(i).setcontribuinte & "|" &
                    arr(i).setdatanascimento & "|" &
                    arr(i).setano & "|" &
                    arr(i).setcurso & "|" &
                    arr(i).setmedia)
        Next
        escrever.Close()
    Else
        escrever = New IO.StreamWriter("alunos.txt")
        For i = 0 To max
            escrever.Write(
                    arr(i).setnome & "|" &
                    arr(i).setcontribuinte & "|" &
                    arr(i).setdatanascimento & "|" &
                    arr(i).setano & "|" &
                    arr(i).setcurso & "|" &
                    arr(i).setmedia)
        Next
    End If

Alguém tem ideias ? É que eu já não sei o que tentar mais.

Cumprimentos.

Edited by ribeiro55
Link to comment
Share on other sites

Aluno é uma classe

Public Class Aluno
Inherits Pessoa
Private ano As Integer
Private curso As String
Private media As Double
Public Property setano As Integer
	Get
		Return ano
	End Get
	Set(value As Integer)
		ano = value
	End Set
End Property
Public Property setcurso As String
	Get
		Return curso
	End Get
	Set(value As String)
		curso = value
	End Set
End Property
Public Property setmedia As Double
	Get
		Return media
	End Get
	Set(value As Double)
		media = value
	End Set
End Property
Public Function calcgabarito() As String
	If (setmedia < 9.5) Then
		Return "Insatisfatório"
	ElseIf (setmedia >= 9.5 And setmedia < 13) Then
		Return "Suficiente"
	ElseIf (setmedia >= 13 And setmedia < 18) Then
		Return "Bom"
	ElseIf (setmedia >= 18 And setmedia < 19) Then
		Return "Muito Bom"
	ElseIf (setmedia >= 19 And setmedia <= 20) Then
		Return "Excelente"
	End If
End Function
End Class
Link to comment
Share on other sites

Tens uma array que é uma instância de uma classe (ou, para ser mais exacto, cada elemento da array é uma instância de uma classe). Cada um destes elementos da array deve ser inicializada com o operador New porque não podes fazer isto directamente:

Dim lista() As New MinhaClasse(parametros)

Não sei como estás a atribuir dados à array. Mostra-me a parte do código na qual lhe atribuis valores, antes de mais nada.

Edited by thoga31

Knowledge is free!

Link to comment
Share on other sites

Estou a atribuir dados à array assim:

Using leitor As New Microsoft.VisualBasic.FileIO.TextFieldParser("alunos.txt")
			leitor.TextFieldType = FileIO.FieldType.Delimited
			leitor.SetDelimiters("|")
			While Not leitor.EndOfData
				linha = leitor.ReadFields()
				max = max + 1
				ReDim Preserve arr(max)
				arr(max) = New Aluno
				For Each campo In linha
					cont = cont + 1
					Select Case cont
						Case 1
							arr(max).setnome = campo
						Case 2
							arr(max).setcontribuinte = campo
						Case 3
							arr(max).setdatanascimento = campo
						Case 4
							arr(max).setano = campo
						Case 5
							arr(max).setcurso = campo
						Case 6
							arr(max).setmedia = campo
					End Select
				Next
				cont = 0
			End While
		End Using
Link to comment
Share on other sites

Difficult one...

Estás a atribuir bem os dados, crias as instâncias correctamente.

Voltemos aqui:

Dá erro dentro do 1º For, apagando todos os dados que tenho dentro do ficheiro.

O erro que te dá deverá descrever a que classe se refere: ao escrever ou ao arr. Diz-me a qual dos dois o VS se refere.

Knowledge is free!

Link to comment
Share on other sites

Ok. Então o problema está no escrever.

Proponho que primeiro que nada simplifiques o teu código, não precisas daquele If para nada. Vai na volta e isto ainda se resolve.

O teu código pode ser simplesmente reduzido a isto:

Dim escrever As New IO.StreamWriter("alunos.txt", False)
For i = 0 To max
   escrever.Write(arr(i).setnome & "|" & _
                  arr(i).setcontribuinte & "|" & _
                  arr(i).setdatanascimento & "|" & _
                  arr(i).setano & "|" & _
                  arr(i).setcurso & "|" & _
                  arr(i).setmedia)
Next
escrever.Close()

Experimenta e toma atenção à caixa de diálogo que se forma anexa ao sublinhado a amarelo. Ela costuma dar mais informações para além do nome do erro. Mostra-nos uma imagem do erro caso ele ocorra.

Assim de repente não consigo ver qual o possível problema, à primeira vista está tudo bem (excepto o facto de teres código a mais desnecessário, mas isto não gera erros deste género, apenas resulta em mau código e possível ineficiência).

Hoje não posso ajudar mais. Talvez alguém amanhã te possa ajudar melhor do que eu, e depois à noite cá voltarei.

Vai testando e lê bem tudo o que o VS te diz, ele não "fala" à toa.

Cumprimentos. 😉

Edited by thoga31

Knowledge is free!

Link to comment
Share on other sites

  • Solution

Obrigado pela ajuda, @thoga31

Continua a dar erro, o mesmo...

Deixo aqui uma imagem do erro:

313nclw.jpg

Cumprimentos. 🙂

Update:

Já resolvi, quando carregava para criar um novo registo fazia a incrementação na variável max e o ReDim Preserve

max = max + 1
Redim preserve arr(max)
arr(max) = New Aluno <-- Faltava isto!

Agora sim, já grava no ficheiro. 😉

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.