Hercles Posted October 10, 2013 at 12:44 AM Report #528298 Posted October 10, 2013 at 12:44 AM Olá! caros pra alterar dados num arquivo .txt eu tenho que apagar e depois escrever la? em lazarus eu uso os mesmo comando de pascal?
thoga31 Posted October 10, 2013 at 02:35 PM Report #528362 Posted October 10, 2013 at 02:35 PM Lazarus é um IDE/compilador que implementa Delphi, uma linguagem derivada do Pascal. Pelo que sim, podes programar em Pascal lá. Em Delphi há novos métodos, mas o velhinho Pascal trata bem do assunto. Podes editar o ficheiro sem ter de apagar a escrever de novo. var f : text; // ... assign(f, 'exemplo.txt'); append(f); seek(0); writeln(f, 'esta passa a ser a nova primeira linha do ficheiro de texto.'); close(f); Knowledge is free!
Hercles Posted October 10, 2013 at 10:27 PM Author Report #528431 Posted October 10, 2013 at 10:27 PM Mas no caso em que o ficheiro já está com dados eu quero retirar um certo dado e colocar outro. tipo: 11111111111 Ivete Sangalo 32 15.000,00 ai eu quero mudar o nome ou a idade ou o salário...
thoga31 Posted October 11, 2013 at 03:11 PM Report #528544 Posted October 11, 2013 at 03:11 PM O mais fácil será usar uma TStringList. Carregas o ficheiro para ela e a partir daí podes fazer as alterações facilmente, gravando de novo o seu conteúdo no final. Knowledge is free!
pwseo Posted October 11, 2013 at 05:43 PM Report #528569 Posted October 11, 2013 at 05:43 PM Esse ficheiro tem uma organização particularmente manhosa. O que representa cada campo? -???------- -Nome-------- Idade -Salário- 11111111111 Ivete Sangalo 32 15.000,00 Habitualmente, colocam-se todos os campos numéricos antes do nome, para que a leitura do nome seja simplesmente "tudo o que resta até ao final da linha". Caso contrário, para ler um nome tens que ir lendo os caracteres um-a-um, até que te apareça um que seja um dígito. Outro pormenor: é habitual armazenarmos os números sem separadores de milhares, e usar o ponto para separador decimal porque isso facilita a leitura do número pelos programas e conversão da sua representação textual para o tipo de dados desejado (ex.: integer). Em suma, eu sugeria algo assim: 111111111 32 15000 Ivete Sangalo PS.: Sei que isto não diz respeito ao Pascal, mas parte de fazer um bom programa consiste em saber também organizar a forma como o mesmo armazena os dados. Caso não tenhas sido tu a decidir o formato dos dados... podes sempre explicar que consideras pouco prático pelos motivos referidos acima. 1 Report
Hercles Posted October 11, 2013 at 09:54 PM Author Report #528606 Posted October 11, 2013 at 09:54 PM então ai é só eu identificar aonde esta a linha que contém o cpf 11111111111 e reescreve-la em uma arquivo txt auxiliar? mas não contigo imaginar com vou fazer isto....
thoga31 Posted October 11, 2013 at 10:04 PM Report #528608 Posted October 11, 2013 at 10:04 PM O CPF tem sempre 11 dígitos? Se sim torna-se relativamente simples fazer isso. Se tiveres os dados organizados por ordem, ainda mais fácil se torna. Faz-se uma pesquisa binária nesse caso pelos primeiros 11 caracteres de cada linha. Knowledge is free!
Hercles Posted October 11, 2013 at 10:12 PM Author Report #528609 Posted October 11, 2013 at 10:12 PM sim o cpf e um documento que identifica um brasileiro... Pra consulta estou usando o código abaixo, mas pra alterar ainda não sei. procedure Tfrmmeusfuncionarios.Button1Click(Sender: TObject); var lst:TStringList; Idx, achou, linha:Integer; f: text; begin lst:=TStringList.Create; if desconectado<>1 then ShowMessage('Banco Desconectado! Você deve selecionar em Arquivo abrir um Banco de dados!') else lst.LoadFromFile(filename); for Idx:=0 to lst.Count-1 do begin cpf:=Trim(Copy(lst[idx],1,11)); if txtcpf.text = cpf then begin nome := Trim(copy(lst[idx],12,30)); Idade := Trim(Copy(lst[idx],42,3)); Salario := Trim(Copy(lst[idx],45,10)); txtnome.text:= nome; txtidade.text:= idade; txtsalario.text:=salario; achou:=1; linha:= Idx; end ; end ; if (cpf ='') and (desconectado= 1) then ShowMessage('Banco de Dados vazio!') else if (achou <> 1) and (desconectado= 1)then ShowMessage('CPF não Cadastrado ou verifique a numeração!'); end;
thoga31 Posted October 11, 2013 at 10:44 PM Report #528615 Posted October 11, 2013 at 10:44 PM Let me get this straight: o nome tem também sempre 30 caracteres, a idade 3 e o salário 10? Mas que uniformidade... Para alterar é o mais simples... não estás a utilizar TStringList? Qual é então o método para gravar num ficheiro? Altera os dados de um índice da TStringList e grava no ficheiro. Knowledge is free!
Hercles Posted October 11, 2013 at 10:47 PM Author Report #528616 Posted October 11, 2013 at 10:47 PM então vou ter que gravar linha por linha em um outro arquivo auxiliar txt e depois copiar para o original e deletar o auxiliar é isso?
thoga31 Posted October 11, 2013 at 11:06 PM Report #528617 Posted October 11, 2013 at 11:06 PM Ficheiro auxiliar? Quem falou em ficheiros auxiliares? E ainda tens o nome no meio da linha? E esse é mesmo o teu método de leitura dos dados? Knowledge is free!
Hercles Posted October 11, 2013 at 11:12 PM Author Report #528618 Posted October 11, 2013 at 11:12 PM (edited) sim. exemplo do meu arquivo txt 77777777777 LUZINETE DOS SANTOS SILVA 50 4000 88888888888 GENILSON DOS SANTOS SILVA 18 2500 10101010101 PENELOPE MACHADO OTAVIANO 29 33000 11111111111 Francisco Santana 84 1500 Edited October 11, 2013 at 11:13 PM by Hercles
thoga31 Posted October 11, 2013 at 11:15 PM Report #528619 Posted October 11, 2013 at 11:15 PM E o teu método de leitura funciona para todos? Não. Portanto, suponho que o @pwseo esteve a falar para as paredes. Knowledge is free!
Hercles Posted October 11, 2013 at 11:30 PM Author Report #528622 Posted October 11, 2013 at 11:30 PM (edited) funciona o arquivo é posicional... são 11 dígitos para o cpf, 30 para o nome, 3 para a idade e 6 para o salario. é que aqui eu não consegui colocar a formatação ex: 11111111111 Francisco da Silveira--------- 23- 500000 22222222222 Maria Castro--------------------44- 600000 Edited October 11, 2013 at 11:32 PM by Hercles
thoga31 Posted October 11, 2013 at 11:31 PM Report #528623 Posted October 11, 2013 at 11:31 PM (edited) E achas que isso assim está bem? É um bom método? Encaixa aí este nome: Joana Fonseca Manuela da Couve Lombarda Feijoada Sousa Mendes Pinto. Edited October 11, 2013 at 11:33 PM by thoga31 Knowledge is free!
Hercles Posted October 11, 2013 at 11:41 PM Author Report #528624 Posted October 11, 2013 at 11:41 PM (edited) poxa mas isto não é minha duvida, pois é só eu aumenta a quantidade de 30 pra 100 ou eu poderia fazer usando um separador " ; " o exercício está assim acho que não me convém muda-lo.... só queria entender como eu faço, depois que eu identificar a linha que eu quero - poder mudar tudo depois que estiver depois dos 11 caracteres iniciais ... Edited October 11, 2013 at 11:44 PM by Hercles
Hercles Posted October 12, 2013 at 01:33 AM Author Report #528633 Posted October 12, 2013 at 01:33 AM Seria algo parecido com isto: procedure Tfrmmeusfuncionarios.btnalterarClick(Sender: TObject); var lst,f:TStringList; Idx, achou:Integer; linha: string; begin lst:=TStringList.Create; if desconectado<>1 then ShowMessage('Banco Desconectado! Você deve selecionar em Arquivo abrir um Banco de dados!') else for Idx:=0 to lst.Count-1 do begin cpf:=Trim(Copy(lst[idx],1,11)); if txtcpf.text = cpf then begin cpf:= txtcpf.text; nome:=txtnome.text; idade:= txtidade.text; salario:=txtsalario.text; linha:= cpf+nome+idade+salario end else linha:= Trim(copy(lst[idx],1,45)) ; end ; writeln(linha[idx],filename[idx]); end ;
pwseo Posted October 12, 2013 at 12:25 PM Report #528661 Posted October 12, 2013 at 12:25 PM (edited) funciona o arquivo é posicional... são 11 dígitos para o cpf, 30 para o nome, 3 para a idade e 6 para o salario. é que aqui eu não consegui colocar a formatação ex: 11111111111 Francisco da Silveira--------- 23- 500000 22222222222 Maria Castro--------------------44- 600000 Se tivesses dito isso mais cedo é que era bom. Se os tamanhos estão definidos, podes simplesmente criar um record com strings desse mesmo tamanho e utilizar o ficheiro como se fosse tipado para esse record. As alterações tornam-se muito simples de efectuar... Quanto à formatação... se metesses tudo dentro de um bloco CODE, não haveria problema. Edited October 12, 2013 at 04:08 PM by pwseo
thoga31 Posted October 12, 2013 at 03:53 PM Report #528666 Posted October 12, 2013 at 03:53 PM (edited) Oh @Hercles, podias ter dito há muito mais tempo que o exercício exigia essa formatação, nós pensávamos que eras tu que fizeste essa formatação. Andamos nós aqui a tentar ajudar a melhorar os métodos e tu vens com "poxas". Digam de uma vez as coisas. Assim não é fácil, com informação às doses racionadas. Agora esclarece-nos outra coisa: é obrigatório no exercício utilizar um determinado tipo de ficheiro, ou és livre de escolher o que quiseres? Pergunto isto só para evitar voltarmos à mesma lengalenga de darmos sugestões e 16 posts depois finalmente ficarmos a saber que afinal X e Y era obrigatório... Edited October 12, 2013 at 03:54 PM by thoga31 Knowledge is free!
Hercles Posted October 12, 2013 at 06:14 PM Author Report #528677 Posted October 12, 2013 at 06:14 PM o exercício tem duas partes a primeira tenho que fazer consulta num arquivo txt (já consegui) e depois tenho que alterar (ainda não consegui)... a segunda parte acho que não é neste forum tenho que lincar o programa a um Banco no MYSQL. tudo isto tem que ser utilizando os menus - aquivo abrir, fechar e salvar - funcionario - achar funcionario, alterar nome, alterar idade, alterar salario ( estes menus e ja os fiz e funcionam certinho no caso da consulta e abrir, fechar arquivo)
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