Jump to content
Hercles

Alterar dados num arquivo txt utilizando um programa em Lazarus...

Recommended Posts

Hercles

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?

Share this post


Link to post
Share on other sites
thoga31

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!

Share this post


Link to post
Share on other sites
Hercles

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...

Share this post


Link to post
Share on other sites
thoga31

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!

Share this post


Link to post
Share on other sites
pwseo

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.

  • Vote 1

Share this post


Link to post
Share on other sites
Hercles

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....

Share this post


Link to post
Share on other sites
thoga31

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!

Share this post


Link to post
Share on other sites
Hercles

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;	  

Share this post


Link to post
Share on other sites
thoga31

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!

Share this post


Link to post
Share on other sites
Hercles

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?

Share this post


Link to post
Share on other sites
thoga31

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!

Share this post


Link to post
Share on other sites
Hercles

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 by Hercles

Share this post


Link to post
Share on other sites
thoga31

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!

Share this post


Link to post
Share on other sites
Hercles

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 by Hercles

Share this post


Link to post
Share on other sites
thoga31

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 by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
Hercles

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 by Hercles

Share this post


Link to post
Share on other sites
Hercles

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 ; 

Share this post


Link to post
Share on other sites
pwseo

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 by pwseo

Share this post


Link to post
Share on other sites
thoga31

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 by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
Hercles

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)

Share this post


Link to post
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.