sabing Posted July 4, 2012 at 02:16 PM Report #467252 Posted July 4, 2012 at 02:16 PM Program Estudo; uses crt; Type Esposas = Record nome:String; email:String; End; Vetor_Esposas = Array[1..10] of Esposas; Var Texto:Text; Op:Integer; Esposa:Vetor_Esposas; i,quantidade:Integer; Temporario:String; Begin Writeln(' 1) CADASTRAR '); Writeln(' 2) MOSTRAR '); Writeln(' 3) LIMPAR '); Writeln(' 4) EDITAR '); Write('Digite a sua opcao: '); Read(Op); case Op of 1: Begin Write('Digite a sua quantidade de cadastro em tempo real : '); Read(quantidade); Assign(Texto,'Arquivo.txt'); {$i-} Reset(Texto); {$i+} For i:= 1 to quantidade do Begin If IOResult <> 0 Then Begin Write('Digite o nome: '); // Ele imprime essa menssagem e fecha sozinho Read(Esposa[i].nome); Write('Digite o email: '); Read(Esposa[i].email); Writeln('Cadastrado com sucesso!'); clrscr; ReWrite(Texto); Writeln(Texto,Esposa[i].nome); Writeln(Texto,Esposa[i].email); Close(Texto); End Else Begin Write('Digite o nome: '); Read(Esposa[i].nome); Write('Digite o email: '); Read(Esposa[i].email); Writeln('Cadastrado com sucesso!'); clrscr; Append(Texto); Writeln(Texto,Esposa[i].nome); Writeln(Texto,Esposa[i].email); Close(Texto); End; End; End; 2: Begin Assign(Texto,'Arquivo.txt'); {$i-} Reset(Texto); {$i+} If IOResult <> 0 Then Begin Writeln('Por favor faça algum cadastro'); End Else Begin While not EoF(Texto) do Begin Readln(Texto,Temporario); Writeln('Nome : ',Temporario); Writeln('Email : ',Temporario); End; End; End; 3: Begin Assign(Texto,'Arquivo.txt'); {$i-} Reset(Texto); {$i+} If IOResult <> 0 Then Begin Writeln('Arquivo nao existe'); End Else Begin While not EoF(Texto) do Begin Readln(Texto,Temporario); If Temporario = '' Then Begin Write('Será apagado'); Erase(Texto); End Else Begin Writeln('O arquivo existe coisa dentro '); Erase(Texto); End; End; End; End; 4: Begin //não estou conseguindo! End Else Writeln('Opcao Errada'); End; End. Eu estou usando o notepad ++ com plugin com o free pascal o problema e que ele compila normal execulta normal quando chega na messagem quando ele chega digite o nome ele teria que ler o nome do registro mais nao le ele fecha por que pessoal? e eu nao estou conseguindo editar uma linha do arquivo também eu pesebi isso acontece quando eu leio mais de uma vez em registro tipo Read(Esposa.nome); // tem vez que ele le e fecha tem vez que nem le e nao procegue será que é o compilador? eu fiz um teste desse no pascalzim funciona normal o problema e que eu nao consigo manipular o arquivo Read(Esposa.email);
thoga31 Posted July 4, 2012 at 03:28 PM Report #467279 Posted July 4, 2012 at 03:28 PM (edited) O teu problema reside no Read, que só lê um caracter: devias utilizar ReadLn, que lê um conjunto de caracteres aka linha de texto. Edited July 4, 2012 at 03:28 PM by thoga31 Knowledge is free!
sabing Posted July 4, 2012 at 03:47 PM Author Report #467282 Posted July 4, 2012 at 03:47 PM Mais mesmo assim ele so le o primeiro faz um exemplo para mim ver
nunopicado Posted July 4, 2012 at 04:48 PM Report #467293 Posted July 4, 2012 at 04:48 PM Vamos por partes: Antes de mais, volto a dizer o que já te disse: Tens de melhorar a indentação. Olhar para o teu código é um pesadelo, no sentido em que não se percebe que código pertence onde. Nem sei como é que te entendes no meio dele. Em segundo lugar, o Assign só é para fazer uma vez. Não quer dizer que usando 3 ou 4 ou mil vezes ele não funcione, mas é meio caminho andado para teres erros mais tarde que não sabes de onde vêm. Usas um assim que começas o programa, e logo a seguir testas se o ficheiro existe ou não, e se não existe, cria-o. A partir daí, só tens de usar o reset e o close (e eventualmente o append, embora eu não seja grande fã deste comando). Terceiro: Raramente o Read é usado. Não é que ele leia só um caracter, mas ao não ter um fim de linha, quando fizeres o write a seguir ele irá baralhar-se visualmente. Além do mais, usando o read, os caracteres CR-LF que inseres (sem saber) ao dar enter vão ficar em memoria, o que irá fazer com que futuros read's sejam passados à frente. Sempre que fizeres uma pergunta ao utilizador, em que ele tenha de escrever uma cadeia de texto, lês com o readln; Quarto: Nunca digas ao utilizador que algo foi feito com sucesso antes de tentares fazer esse algo... Dizes ali 'Cadastrado com sucesso' assim que o utilizador te dá os dados, antes mesmo de os tentares escrever no ficheiro. Primeiro escreves, e depois, se não der erro, é que dás a mensagem ao utilizador. Quinto: Estás a escrever cada registo em duas linhas (escreves no ficheiro o nome, e depois na linha seguinte escreves o email), mas ao ler, só estás a ler uma linha, para a variavel temporario. Resultado, nome e email vão estar iguais, e muito provavelmente, não vão ter nada a ver com a realidade. Ao leres tens de ler para cada registo o mesmo numero de linhas que escreveste. Escreves 2, les 2. Uma delas será o nome, a segunda será o email. Sexto: Para editares, tens de ter noção da posição do ficheiro onde estás, e nunca perder o rasto dessa posição. De cada vez que fazes um readln no ficheiro, ele muda para a linha seguinte e quando fores escrever os dados alterados, já vais estar no sitio errado. O resultado: ficheiro corrompido. Uma das maneiras é atribuires um código virtual ao registo. Por exemplo, ao mostrar, para cada registo dá-lhe um número. Depois ao editar, perguntas o nº, e vais andando pelo ficheiro até essa posição. Depois é só escrever e pronto! "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
thoga31 Posted July 4, 2012 at 05:05 PM Report #467301 Posted July 4, 2012 at 05:05 PM Em complemento aos 6 pontos do @nunopicado, recomendo o estudo deste editor de texto simples, onde todos os princíos aqui referidos estão aplicados, inclusive o sexto ponto. 😉 Knowledge is free!
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now