Ir ao conteúdo
  • Cadastre-se

Pascal/Delphi Manipulação de arquivos de texto


Posts recomendados

Olá amigos.

Estou com dificuldade em manipulação de arquivos de texto, mais precisamente no excluir e no alterar.

Criei o projeto e o programa até cria o arq.aux (que é usado para excluir), mas não copia nada para ele e nem apaga o original.

 

Alguém pode revisar para mim?

 

Grato.

 

 

Código:

program project1;

uses crt,sysutils;

type
 cadastro = record
           modelo: string;
           cor   : string;
           end;
var
    arq : textfile;
    arq2: textfile;
    opcao : integer;
    auto : cadastro;
     linha : string;

begin
Assignfile(arq, 'garagem.txt');
Assignfile(arq2, 'garagemaux.txt'); //cria arq tmp p/ excluir
if (fileexists ('garagem.txt') = false)then

begin
  rewrite(arq);   //abre  arquivo
  closefile(arq);
end;


repeat
 writeln('1 - Inserir Registro ');
 writeln('2 - Ver Registros');
 writeln('3 - Excluir Registro');
 writeln('4 - Alterar registro');
 writeln('5 - Sair');
 readln(opcao);


  case opcao of
//inserir
   1 : begin
        write('Digite o nome do veiculo: ');
        readln(auto.modelo);
        write('Digite a cor do veiculo: ');
        readln(auto.cor);
        Append(arq);  //final do arquivo
        writeln(arq, auto.modelo:10,auto.cor:10);
        Closefile(arq);
        clrscr;
       end;


//listar
   2 : begin
        reset(arq);   //ABRE O ARQ
        while not EOF(arq) do
        begin
         readln(arq,auto.modelo,auto.cor);
         writeln(auto.modelo,auto.cor);
        end;
        readkey;
        closefile(arq);
         end;



  //excluir
     3 : begin
          writeln('qual modelo desejas excluir: ');
          readln(linha);
          reset (arq); //abre o arq no inicio
          rewrite(arq2);
          while not (EOF(arq)=false) do //enquanto nao for o final do arquivo
          begin
          readln(arq,auto.modelo);
          if (linha <> auto.modelo)  then
          begin
          writeln(arq2,auto.modelo);
          end;

          closefile(arq);
          closefile(arq2);

          erase(arq);

          rename(arq2,'garagem.txt');


          end;

     end;



  //alterar
  // 4 :
  end;
       begin
        writeln('');
        writeln('Aperte qualquer tecla para voltar ao menu');

        clrscr;
       end;
until (opcao = 5);
Closefile(arq);
end.

 

teste.txt

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Após algum trabalho consegui algum resultado, só não consegui excluir ou alterar somente a cor ou o modelo, apenas um.

 

Consegui excluir/alterar toda a linha do arquivo no qual fica salvo as informações.

 

Alguém pode dar uma luz.

 

Código:

program project1;

uses
  crt,
  SysUtils;

type
  cadastro = record
    modelo: string;
    cor: string;
  end;
var
  arq: textfile;
  arq2: textfile;
  opcao, x, y: integer;
  auto: cadastro;
  linha: string;
  modeloatual, newmodel: string;

begin
  Assignfile(arq, 'garagem.txt');
  if (fileexists('garagem.txt') = False) then

  begin
    rewrite(arq);   //abre  arquivo
  end;


  repeat
    ////////////////////////////////////////
         textbackground(2);
         clrscr;
         textbackground(2);
         textcolor(7);
        writeln('  =====================================================');
        gotoxy(3,2);textcolor(red+blink);
        writeln('+               GARAGEM SUAVE NA NAVE              +');
        textcolor(7);
        writeln('  =====================================================');
        writeln;
        writeln;
        writeln('                  SELECIONE UMA OPCAO                  ');
        writeln('  [1] Inserir Registro ' );
        writeln('  [2] Ver registro ' );
        writeln('  [3] Excluir Registro ' );
        writeln('  [4] Alterar Registro ' );
        writeln('  [5] Finalizar Sistema ' );
        gotoxy (35,8);
        textcolor(red);
        textbackground(white);
        gotoxy (35,9);
        writeln('==============');
        gotoxy (35,10);
        writeln('| OPCAO =    |' );
        gotoxy (35,11);
        writeln('==============');
        gotoxy (45,10);
        gotoxy(1,29);
        writeln('Contato: [email protected]');
        readln(opcao);
        textcolor(7);
        textbackground(2);


    ///////////////////////////////////////

    if (opcao = 1) then
      //inserir

    begin
      gotoxy(3,15);
      Write('Digite o nome do veiculo: ');
      readln(auto.modelo);
      gotoxy(3,15);
      Write('Digite a cor do veiculo: ');
      readln(auto.cor);
      Append(arq);  //final do arquivo
      //  writeln(arq, auto.modelo, '-' , auto.cor);
      writeln(arq, auto.modelo, auto.cor);
      Closefile(arq);
      clrscr;
    end;

    ///////////////////////////////////
    //listar
    if (opcao = 2) then
    begin
      gotoxy(3,15);
      reset(arq);   //ABRE O ARQ
      while not EOF(arq) do
      begin
        readln(arq, auto.modelo);
        writeln(auto.modelo);
      end;
      writeln('');
      writeln('Tecle <ENTER> para continuar ');
      readkey;
      closefile(arq);
    end;

    //////////////////////////////////
    //excluir

    if (opcao = 3) then
    begin
      gotoxy(3,15);
      writeln('qual modelo desejas excluir:');
      Assignfile(arq2, 'garagemaux.txt'); //cria arq tmp p/ excluir
      rewrite(arq2);
      readln(linha);
      reset(arq); //abre o arq no inicio
      while not EOF(arq) do //enquanto nao for o final do arquivo
      begin

        readln(arq, auto.modelo);

        begin
          if (auto.modelo <> linha) then
          begin

            append(arq2);

            writeln(arq2, auto.modelo);
            closefile(arq2);
          end;
        end;
      end;
      closefile(arq);
      deletefile('garagem.txt');
      renamefile('garagemaux.txt', 'garagem.txt');
    end;

    ///////////////////////////////////////
    //alterar
    if (opcao = 4) then
    begin
      gotoxy(3,15);
      Assignfile(arq2,'garagemaux.txt');

      writeln('qual modelo desejas alterar: ');
      readln(modeloatual);
      gotoxy(3,15);
      writeln('qual o novo modelo: ');
      readln(newmodel);

      reset(arq); //abre o arq no inicio
      rewrite(arq2); //abrir arquivo preparando para escrever

      while not EOF(arq) do //enquanto nao for o final do arquivo
      begin
        readln(arq,auto.modelo);

        if (auto.modelo = modeloatual) then
        begin
          writeln(arq2,newmodel);
        end
        else
        begin
          writeln(arq2,auto.modelo);
           closefile(arq2);
        end;
      end;
      closefile(arq);
      deletefile('garagem.txt');
      renamefile('garagemaux.txt','garagem.txt');
    end;

    begin
      writeln('');
      writeln('Aperte qualquer tecla para voltar ao menu');

      clrscr;

    end;
  until (opcao = 5);

end.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá @gilmar.vicente.

 

16 horas atrás, gilmar.vicente disse:

[...] não consegui excluir ou alterar somente a cor ou o modelo, apenas um.

 

Consegui excluir/alterar toda a linha do arquivo no qual fica salvo as informações.

 

Então, existe um conceito muito importante ao trabalhar com "Armazenamento e recuperação de dados" que é (obs.: vou utilizar as minhas palavras):

"Para preparar uma estrutura para armazenar algo, tem que também já se preocupar com a estrutura para recuperá-lo", ou seja, não adianta tentar armazenar algo que não se possa recuperar... ou mais especificamente no seu caso, que seja recuperado de uma forma prática...

 

Vamos lá:

 

Para escrever, você usou assim:

writeln(arq, auto.modelo, auto.cor); //escreve no arquivo a partir de onde está posicionado [Simon.Viegas]

ou seja, no arquivo vai aparecer simplesmente o "modelo do carro" e a sua "cor", mas se você observar o arquivo, os dados estão "colados". Ex.: Inserir "Palio" e "Preto" respectivamente. No arquivo ficou "PalioPreto". Era assim que você queria?

 

Não tem problema... como citado lá em cima em negrito, era necessário em conjunto já saber como vai recuperar esses dados... Perceba que ao ler a linha, vai vir tudo junto... ou seja, o:

readln(arq, auto.modelo);

Vai ler a linha toda!! o "modelo" contém "PalioPreto". Entende?

 

 

O arquivo de texto não é estruturado em "registros" (o que se podem imaginar)... ele é apenas um arquivo de txt como qualquer outro... ele não faz ideia que esses dois dados (modelo e cor) estão separados... nem muito menos faz ideia que existe um programa o gerenciando... o writln() do Pascal funciona como uma "caneta"... e o read() como o "coletador de linhas". Essa separação em duas "informações" é uma abstração do contexto do SEU problema...

 

Então, se faz necessário criar uma lógica para conseguir separar essas informações... do jeito que está armazenado, uma seria criar um método (no sentido de função/procedimento em Pascal) para identificar as palavras e separá-las, algo como "copia a primeira palavra indo da primeira letra até a letra anterior a próxima letra maiúscula" e "copia da segunda letra maiúscula até o final para segunda palavra".... Tá me entendendo?  Se analisar, verás que essa lógica poderá trazer problemas, pois a linha tem que está nesse padrão...

 

Conclusão:

Citação

É necessário criar uma lógica para armazenar, que ao mesmo tempo seja prática para se recuperar.

 

Uma forma bem mais simples seria separar por linhas... simples assim. Daí, cada carro ocuparia duas linhas (se forem 2 dados, é claro).

Uma outra forma, seria criar um outro padrão/técnica... como separar os dados por uma flag... exemplo de dados:

Palio|Preto|5 portas|2018|2018

Nesse sentido, utilizaria o "|" para indicar a separação entre dados... a barra seria inseria pelo grama, lá na hora do writeln(). Daí, ao ler a linha, o programa usaria a tal "|" como parâmetro para separar as linhas (parecido com a lógica para verificar as letras maiúsculas).

 

Etc

 

 

RESUMINDO e frisando:

Reformule a forma de escrever no arquivo de modo que seja prático ou funcional ler os dados de volta.

A parte para reescreve acho que você já domina.

 

 

Qualquer dúvida é só postar.

 

 

ADENDO:

Abaixo peguei o seu código e tentei dar uma reorganizada na estrutura. Veja, não alterei nada na lógica, apenas tentei rearrumar e aproveitei para fazer alguns comentários/sugestões/correções de alguns pequenos detalhes.

program project1;
uses
  CRT,
  SysUtils;
type
  cadastro = record
    modelo: string;
    cor: string;
  end;
var
  arq : textfile;
  arq2: textfile;
  opcao, x, y: integer;
  auto: cadastro;
  linha: string;
  modeloatual, newmodel: string;

BEGIN
  {AssignFile(arq, 'garagem.txt');} //aqui não funcinou esse comando. obs.: substituir tudo por Assign() para rodar aqui [Simon.Viegas]
  Assign(arq,'garagem.txt'); //associa o arquivo ao caminho dele [Simon.Viegas]
  if (FileExists('garagem.txt') = FALSE) then
    ReWrite(arq); //abre o arquivo
    //obs.: sobre o comentário anterior: na verdade ele tentar(RE) CRIAR E ABRIR um arquivo. Para abrir, usam-se o reset() ou append() [Simon.Viegas]
  repeat
    ////////////////////////////////////////
    TextBackground(2);
    ClrScr;
    {TextBackground(2);} //de novo? [Simon.Viegas]
    TextColor(7);
    writeln('  =====================================================');
    GotoXY(3,2); TextColor(RED+BLINK);
    writeln('+               GARAGEM SUAVE NA NAVE              +');
    TextColor(7);
    writeln('  =====================================================');
    writeln;
    writeln;
    writeln('                  SELECIONE UMA OPCAO                  ');
    writeln('  [1] Inserir Registro ' );
    writeln('  [2] Ver registro ' );
    writeln('  [3] Excluir Registro ' );
    writeln('  [4] Alterar Registro ' );
    writeln('  [5] Finalizar Sistema ' );
    {GotoXY(35,8);} //não está servindo para nada, já que antes de fazer alguma coisa, é invocado outro GotoXY [Simon.Viegas]
    GotoXY(35,9); TextColor(RED);  TextBackground(WHITE);
    writeln('==============');
    GotoXY(35,10); writeln('| OPCAO =    |' );
    GotoXY(35,11); writeln('==============');
    GotoXY(45,10); //não está servindo para nada, já que antes de fazer alguma coisa, é invocado outro GotoXY [Simon.Viegas]
    GotoXY(1 ,29); writeln('Contato: [email protected]');
    readln(opcao);
    TextColor(7);
    Textbackground(2);
    ///////////////////////////////////////
    if (opcao = 1) then
      //inserir
      begin
      GotoXY(3,15); write('Digite o nome do veiculo: '); readln(auto.modelo);
      GotoXY(3,15); write('Digite a cor do veiculo : '); readln(auto.cor);
      Append(arq); //abre o arquivo para escrita e posiciona no fim do arquivo (novos dados abaixo) [Simon.Viegas]
      //writeln(arq, auto.modelo, '-' , auto.cor);
      writeln(arq, auto.modelo, auto.cor); //escreve no arquivo a partir de onde está posicionado [Simon.Viegas]
      {CloseFile(arq);} //aqui não funcinou esse comando. obs.: substituir tudo por Close() para rodar aqui [Simon.Viegas]
      Close(arq);
      ClrScr;
      end;
    ///////////////////////////////////
    //listar
    if (opcao = 2) then
      begin
      GotoXY(3,15);
      Reset(arq); //abre o arquivo para leitura e fica posicionado no início do arquivo (como ler do início) [Simon.Viegas]
      while not EOF(arq) do //em quanto não for o fim do arquivo [Simon.Viegas]
        begin
        readln(arq, auto.modelo); //ler a linha do arquivo apatir de onde está posicionado [Simon.Viegas] ###
        writeln(auto.modelo); 
        end;
      writeln('');
      writeln('Tecle <ENTER> para continuar ');
      ReadKey;
      Close(arq); //fecha o arquivo
      end;
    //////////////////////////////////
    //excluir
    if (opcao = 3) then
      begin
      GotoXY(3,15); writeln('qual modelo desejas excluir:');
      Assign(arq2,'garagemaux.txt');
      ReWrite(arq2); //cria arq tmp p/ excluir
      readln(linha);
      Reset(arq); //abre o arq no inicio
      while not EOF(arq) do //enquanto nao for o final do arquivo
        begin
        readln(arq, auto.modelo);
        {begin} //não está vinculado a nada [Simon.Viegas]
        if (auto.modelo <> linha) then
          begin
          Append(arq2);
          writeln(arq2,auto.modelo);
          Close(arq2);
          end;
        {end;} //não está vinculado a nada [Simon.Viegas]
        end;
      Close(arq);
      Deletefile('garagem.txt');
      Renamefile('garagemaux.txt', 'garagem.txt');
      end;
    ///////////////////////////////////////
    //alterar
    if (opcao = 4) then
      begin
      GotoXY(3,15); 
      Assign(arq2,'garagemaux.txt');
      writeln('qual modelo desejas alterar: ');
      readln(modeloatual);
      GotoXY(3,15); writeln('qual o novo modelo: ');
      readln(newmodel);
      Reset(arq); //abre o arq no inicio
      Rewrite(arq2); //abrir arquivo preparando para escrever
      while not EOF(arq) do //enquanto nao for o final do arquivo
        begin
        readln(arq,auto.modelo);
        if (auto.modelo = modeloatual) then
          begin
          writeln(arq2,newmodel);
          end
        else
          begin
          writeln(arq2,auto.modelo);
          Close(arq2);
          end;
        end;
      Close(arq);
      DeleteFile('garagem.txt');
      RenameFile('garagemaux.txt','garagem.txt');
      end;
    {begin} //não está vinculado a nada [Simon.Viegas]
    writeln('');
    writeln('Aperte qualquer tecla para voltar ao menu');
    Clrscr;
    {end;} //não está vinculado a nada [Simon.Viegas]
  until (opcao = 5);
END.

 

Existem outros pequenos detalhes... mas que podem ficar para depois... o foco aqui é na "escrita" e "releitura dos dados".

 

No aguardo.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Olá Simon.

Consegui escrever no arquivo de texto de forma mais organizada.

por exemplo:

 

Palio|Preto|5 portas|2018|2018

 

Gostaria de excluir somente a cor do exemplo acima.

 

Palio|5 portas|2018|2018

 

ex:

begin

 

O que desejas excluir?

1-modelo

2-cor

3-ano

 

readln(cor);

for i := 1 to length(cor) do 

end.

 

É por aqui?

 

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

13 horas atrás, gilmar.vicente disse:

Gostaria de excluir somente a cor do exemplo acima.

 

Primeiramente você precisar ter os dados...

 

Após ler a linha do arquivo, você vai separando e jogando num record.

 

Poderia ser algo assim:

Usa o Pos() para pegar a posição da "|";

Usa o Copy() para copia o dado;

Usa o Delete() para apagar o dado lido, para .

Repete esse processo até ler todos os dados.

 

Pronto... ai você precisa definir o que seria "excluir"... até porque não existe um carro sem cor... mas resumidamente você poderia substituir por outra coisa, por exemplo "Não informado"... ou seja, basicamente será um processo de "alteração". Ai só escreve o dados novamente no arquivo...

 

No aguardo.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

help-me.

Estou trancado, não sei se estou na caminho certo.

É preciso criar um arquivo temporário?

 

Só mais uma pergunta.

Se o arquivo for em formato binário não é possível excluir parte da informação?

somente todo o bloco de informação.

correto?

 

   begin

      reset(arq);
      while not EOF(arq) do

      readln(arq,auto.modelo);
      i := 0;

      repeat
        //localiza o primeiro pipe existente da linha
        posicao := pos('|',auto.modelo );

        if posicao = 0 then  // se não existe pipe na string
        posicao := length(auto.modelo) + 1; //lê o resto da linha

        // armazena a parte da linha que corresponde ao campo
        campo[i] := copy(auto.modelo, 1,pred(posicao));

        //elimina o campo lido da linha
        delete(auto.modelo, 1, posicao );

      until (posicao >= length(auto.modelo));

    end;

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá

 

13 horas atrás, gilmar.vicente disse:

É preciso criar um arquivo temporário?

Isso não muda... não tem relação com o que estamos vendo... estamos especificamente na parte de "ler a linha e obter os dados do carro". Reescrever o arquivo é outra coisa.

 

É assim, você vai pegar a linha do arquivo e copiar cada parte da linha na sua respectiva posição no record. O objetivo aqui é ter os dados! O que vai fazer com eles depois é outra história.

 

Pense assim:

Imagine que você tem 2 variáveis do tipo cadastro: auto1 e auto2. O que estamos vendo aqui, seria a capacidade de "escrever os dados de auto1 num arquivo de texto" e depois conseguir ler o arquivo e jogar os dados no auto2. É isso. O arquivo serve basicamente para persistir os dados...

 

Você precisa passar os dados do carro que está no arquivo para a variável do tipo cadastro. Ai faz o que tem que fazer no record...

 

 

 

 

13 horas atrás, gilmar.vicente disse:

Se o arquivo for em formato binário não é possível excluir parte da informação?

somente todo o bloco de informação.

correto?

De certo modo sim... é exatamente a mesma coisa do arquivo de texto.

Tanto no arquivo de texto, tanto no arquivo binário, os dados do carro estão em blocos... no de texto está em uma linha, no arquivo binário está num "registro binário do record". E em ambos você sempre vai ler esse bloco completo (a linha ou o record, respectivamente). Daí, você pode fazer o que você quiser com os dados e reinscreve... No arquivo de texto, com aquela estrutura de um arquivo temporário, e no arquivo binário, reposicionando na linha corresponde e escrevendo.

 

 

 

Em relação ao contexto do arquivo de texto, continua o que disse:

Em 14/03/2018 às 11:51, Simon Viegas disse:

Após ler a linha do arquivo, você vai separando e jogando num record.

 

Poderia ser algo assim:

Usa o Pos() para pegar a posição da "|";

Usa o Copy() para copia o dado;

Usa o Delete() para apagar o dado lido, para .

Repete esse processo até ler todos os dados.

 

Ou seja, acha o primeiro dado e joga no record.

acha o segundo, e joga no record...

acha o terceiro, e joga no record...

etc.

 

 

 

***

 

Se tiver alguma dúvida, é só postar.

 

Por favor, quando posta um código, poste ele completo, pois assim facilita as verificações.

 

 

 

No aguardo.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...