Advertisement
mariosimao

procedimentos de arquivos

Dec 18th, 2016
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 7.49 KB | None | 0 0
  1. program testeArq;
  2.  
  3. uses crt;
  4.  
  5. type
  6.     registro = record
  7.         nome: string;
  8.         idade: integer;
  9.     end;
  10.  
  11.     tipoArq = file of registro;
  12.  
  13. {====================================================================}
  14.  
  15. procedure procurarItem (var arq: tipoArq; nome: string; var poscicaoItem: integer);
  16.  
  17. var
  18.     regAux: registro;   // registro auxiliar para comparar o nome procurado com o nome do registro. o auxiliar se move pelo arquivo da turma
  19.     achou: boolean;     // variavel que indica se o aluno foi encontrado (<ACHOU> = TRUE) ou não encontrado (<ACHOU> = FALSE)
  20.  
  21. begin
  22.  
  23.     seek(arq,0);                                            // posiciona no começo do arquivo
  24.     poscicaoItem:= -1;                                      // para quando começar o contador na primeira posicao do arquivo, poscicaoItem = 0;
  25.     achou:= false;                                          // inica a variável de encontro como FALSE
  26.  
  27.     while (achou = false) and not eof(arq) do               // enquanto não achou o aluno ou o arquivo não acabou -->
  28.     begin
  29.  
  30.         read(arq,regAux);                                   // --> lê uma linha (aponta pra i --> aponta pra i+1)
  31.         if (nome = regAux.nome) then achou:= true;          // --> se achou ... muda a variável de encontro
  32.         poscicaoItem:= poscicaoItem + 1;                    // --> contador da posicao do aluno
  33.  
  34.     end;
  35.  
  36.     if achou = false then poscicaoItem:= -1;                // se não achou --> define a posição como -1
  37.  
  38. end;
  39.  
  40. {====================================================================}
  41. procedure adicionarItem (var arq: tipoArq);
  42.  
  43. var
  44.     nome: string;                               // variáveis que receberam os dados informados pelo usuário
  45.     idade: integer;
  46.  
  47.     regTemp,aux1,aux2: registro;                // Registro temporário para armazenar os dados antes de salvar no arquivo
  48.     poscicaoItem: integer;                      // variável usada para verificar se o item já se encontra no arquivo. se ele não está no arquivo (poscicaoItem = -1)
  49.  
  50. begin
  51.  
  52.     write('nome: ');
  53.     readln(nome);                                                                           // Recebe e passa por tratamento de erro o nome
  54.    
  55.     procurarItem(arq,nome,poscicaoItem);                                                    // Procura se existe um item com mesmo nome no arquivo (retorna a posição se encontrar e -1 se encontrar)
  56.  
  57.     if poscicaoItem >= 0 then writeln('O item já está cadastrado nessa turma.'#13#10)     // Se já exsite o item no arquivo: mensagem
  58.     else                                                                                    // Se não existe -->
  59.     begin
  60.  
  61.         write('idade: ');                                                                   // --> recebe os dados restantes
  62.         readln(idade);
  63.  
  64.         regTemp.nome:= nome;                                                                // --> armazena os dados em um registro temporário antes de salvar no arquivo
  65.         regTemp.idade:= idade;
  66.  
  67.         // Inserir ordenado
  68.         if filesize(arq)=0 then                                                             // --> se o arquivo da turma está vaio ...
  69.         begin                                                                               // --> ... grava os dados na primeira posição
  70.             seek(arq, 0);          
  71.             write(arq,regTemp);
  72.         end
  73.         else                                                                                // --> se já existiam outros itens no arquivo ...
  74.         begin
  75.        
  76.             reset(arq);
  77.             while not eof(arq) do                                                           // --> ... até o final do arquivo ***
  78.             begin
  79.  
  80.                 read(arq,aux1);                                                             // --> ... *** grava o item da posição atual num registro auxiliar temporário
  81.                 if aux1.nome>regTemp.nome then                                              // --> ... *** compara os nomes dos itens (ordenção por ordem alfabética)
  82.                 begin
  83.  
  84.                     seek(arq, filepos(arq)-1);                                              // --> ... *** volta posição ponteiro para se escrever na posição desejada
  85.                     aux2:=aux1;                                                             // --> ... *** (o ultimo item não é gravado dentro do while)
  86.                     write(arq,regTemp);
  87.                     regTemp:=aux2;
  88.  
  89.                 end;
  90.  
  91.             end;
  92.  
  93.             seek(arq, filesize(arq));                                                       // --> ... grava o ultimo item no arquivo
  94.             write(arq, regTemp);
  95.  
  96.         end;
  97.  
  98.         writeln(#13#10'Item adicionado com sucesso!');
  99.  
  100.     end;
  101.  
  102. end;
  103.  
  104. {====================================================================}
  105. // Ordena os registros de um arquivo
  106.  
  107. procedure ordenarArquivo(var arq: tipoArq);
  108.  
  109. var
  110.     aux, valorProx, valorPos: registro;
  111.     indicePos, indicePosProx: integer;  // indice de posição, indice da próxima posição
  112.  
  113. begin
  114.  
  115.     for indicePos:=0 to filesize(arq)-1 do
  116.     begin
  117.  
  118.         for indicePosProx:=indicePos+1 to filesize(arq)-1 do
  119.         begin
  120.  
  121.             seek(arq,indicePos);
  122.             read(arq,valorPos);
  123.             seek(arq,indicePosProx);
  124.             read(arq,valorProx);
  125.  
  126.             if valorProx.nome < valorPos.nome then
  127.             begin
  128.  
  129.                 aux.nome:= valorProx.nome;
  130.                 aux.idade:= valorProx.idade;
  131.  
  132.                 valorProx.nome:= valorPos.nome;
  133.                 valorProx.idade:= valorPos.idade;
  134.  
  135.                 valorPos.nome:= aux.nome;
  136.                 valorPos.idade:= aux.idade;
  137.  
  138.                 seek(arq,indicePos);
  139.                 write(arq,valorPos);
  140.                 seek(arq,indicePosProx);
  141.                 write(arq,valorProx);
  142.  
  143.             end;
  144.  
  145.         end;
  146.  
  147.     end;
  148.  
  149. end;
  150.  
  151. {====================================================================}
  152. procedure excluirItemArquivo(var arq: tipoArq; posicaoAluno: integer);
  153.  
  154. var
  155.     posicao: integer;       // indice da posição, usado para ir da posição do aluno até a penultima posição
  156.     regAux: registro;       // registro auxiliar, usado para salvar temporariamente registros no processo de exclusão
  157.  
  158. begin
  159.  
  160.     if filesize(arq)=1 then                                             // se o arquivo da turma só tem 1 aluno -->
  161.     begin
  162.         rewrite(arq);                                                   // --> apaga o arquivo antigo e cria um novo arquivo vazio
  163.     end
  164.     else
  165.     begin
  166.         if posicaoAluno = filesize(arq) - 1 then                        // se o aluno a ser exluido se encontra na ultima posição do registro -->
  167.         begin
  168.  
  169.             seek(arq,posicaoAluno);                                     // --> posiciona na penultima posição
  170.             truncate(arq);                                              // --> apaga tudo abaixo da penultima posição
  171.  
  172.         end
  173.         else                                                            // se não se encontra na ultima posição -->
  174.         begin
  175.  
  176.             seek(arq,posicaoAluno);                                     // --> posiciona no aluno
  177.             for posicao:= posicaoAluno to filesize(arq) - 2 do          // --> da posição do aluno (i) até a penultima posição ...
  178.             begin
  179.  
  180.                 seek(arq,posicao+1);                                    // --> ... pula para a proxima posicao (i + 1)
  181.                 read(arq,regAux);                                       // --> ... salva o proximo
  182.                 seek(arq,posicao);                                      // --> ... volta pra posicao do aluno (i)
  183.                 write(arq,regAux);                                      // --> ... substitui o aluno a ser excluido pelo aluno seguinte
  184.  
  185.             end;
  186.                                                                         // [ no final, o ultimo e o penultimo aluno vao ser iguais, por isso: ]
  187.             seek(arq,filesize(arq)-1);                                  // --> posiciona na penultima posição
  188.             truncate(arq);                                              // --> apaga tudo abaixo da penúltima posição
  189.  
  190.         end;
  191.     end;
  192.  
  193. end;
  194.  
  195. {====================================================================}
  196.  
  197. {====================================================================}
  198.  
  199. var
  200.     rec,recAux: registro;
  201.     arq: tipoArq;
  202.     op: integer;
  203.     nome: string;
  204.     i,posicaoItem: integer;
  205.  
  206. begin
  207.  
  208.     assign(arq,'dados.dat');
  209.     {$I-}
  210.     reset(arq);
  211.     {$I+}
  212.     if ioresult = 2 then rewrite(arq);
  213.  
  214.     repeat
  215.     begin
  216.        
  217.         clrscr;
  218.         writeln('1. Inserir');
  219.         writeln('2. Inserir ordenado');
  220.         writeln('3. Ordenar');
  221.         writeln('4. Excluir');
  222.         writeln('5. Imprimir');
  223.         write('op: '); readln(op);
  224.  
  225.         case op of
  226.  
  227.             1:begin
  228.            
  229.                 write('Nome: ');
  230.                 readln(recAux.nome);
  231.                 write('Idade: ');
  232.                 readln(recAux.idade);
  233.  
  234.                 seek(arq,filesize(arq));
  235.                 write(arq,recAux);
  236.  
  237.             end;
  238.  
  239.             2:begin
  240.            
  241.                 adicionarItem(arq);
  242.        
  243.             end;
  244.  
  245.             3:begin
  246.  
  247.                 ordenarArquivo(arq);
  248.  
  249.             end;
  250.  
  251.             4:begin
  252.  
  253.                 write('nome: ');
  254.                 readln(nome);
  255.                 procurarItem(arq,nome,posicaoItem);
  256.                 excluirItemArquivo(arq,posicaoItem);
  257.  
  258.             end;
  259.  
  260.             5:begin
  261.  
  262.                 for i:= 0 to filesize(arq)-1 do
  263.                 begin
  264.                
  265.                     seek(arq,i);
  266.                     read(arq,recAux);
  267.                     writeln(recAux.nome,' - ',recAux.idade);
  268.                
  269.                 end;
  270.  
  271.             end;
  272.  
  273.             0:begin
  274.  
  275.             end;
  276.        
  277.         end;
  278.        
  279.         readkey;
  280.    
  281.     end;
  282.     until op = 0;
  283.  
  284. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement