Ir para o conteúdo

Editor de Texto

Este editor permite criar, consultar e editar ficheiros. A edição não permite criar linhas, só alterar linhas específicas. O programa está devidamente comentado.

program editor_texto;
uses crt,dos;
var fich:text; // Ficheiro a criar, consultar ou editar
    aux:text; // ficheiro auxiliar para edição
    nome:string; // nome do ficheiro a criar
    nome_aux:string;  // nome do ficheiro auxiliar para edição
    line:string; // string que vai guardando cada linha do documento
    opt:char; // para menus
    opt2:char; // para edições
    i,j:integer; // contadores de linhas e outros


function existeficheiro: boolean;  // verifica se existe um ficheiro
begin
assign (fich, nome);
{$I-};
Reset (fich);
Close (fich);
{$I+};
existeficheiro:=(IoResult=0);
end;

procedure criar;  // criação de ficheiros
begin
     clrscr;
     writeln('A CRIAR UM FICHEIRO DE EXTENSAO TXT');
     writeln;
     writeln('INTRODUZA:');
     write('Nome do ficheiro: '); readln(nome);
     nome:=nome+'.txt';  // nome.*txt
     if NOT existeficheiro then begin  // se NÃO existir o ficheiro, então este é criado
     rewrite(fich);
     writeln;
     writeln('Conteudos:  (nota: ao escrever "<EXIT>" termina a escrita do ficheiro. Para paragrafo, basta fazer ENTER.)');
     i:=0;
     repeat
           i:=i+1;
           write('Linha ',i,': '); readln(line);
           if line='' then writeln('   [Foi feito paragrafo]');  // detector de parágrafos
           if upcase(line)<>'<EXIT>' then writeln(fich,line);
     until upcase(line)='<EXIT>'; // ir escrevendo as linhas do ficheiro, até dar ordem de saída
     if i=1 then writeln('NOTA: O ficheiro ficou vazio. Sera considerao que nao existe!');  // Se i=1, só foi feito <EXIT>, logo o ficheiro está vazio
     close(fich);
     end
     else writeln('[O ficheiro "',nome,'" ja existe!]');  // no caso de haver o ficheiro nomeado, é dado o alerta
     write('Prima qualquer tecla...'); readkey;
end;

procedure consultar;  // ver o conteudo de um ficheiro já existente
begin
     clrscr;
     writeln('A CONSULTAR UM FICHEIRO DE EXTENSAO TXT');
     writeln;
     write('Nome do ficheiro a consultar: ');
     readln(nome);
     nome:=nome+'.txt';

     if existeficheiro then begin  // Se o ficheiro EXISTE, então é lido
        reset(fich);
        i:=0;
        while NOT eof(fich) do begin  // até ao fim do ficheiro, ir mostrando conteúdo linha a linha
              i:=i+1;
              readln(fich,line);
              writeln('Linha ',i,': ',line);
        end;
        writeln('[Fim de ficheiro]');
        close(fich);
     end
     else writeln('[Nao existe o ficheiro "',nome,'"]');  // Se o ficheiro NÃO existe, é dado o alerta e a operação é cancelada
     write('Prima qualquer tecla...'); readkey;
end;

procedure editar;  // lê e edita um ficheiro
begin
     clrscr;
     writeln('A EDITAR UM FICHEIRO DE EXTENSAO TXT');
     writeln;
     write('Nome do ficheiro a editar: '); readln(nome);
     nome:=nome+'.txt';

     repeat
     opt2:='N';
     if existeficheiro then begin  // se o ficheiro nomeado EXISTE, então este é lido e, se assim ordenado, é editado linha a linha
        reset(fich);
        nome_aux:=nome+'_aux.txt';  // nome.txt_aux.*txt
        assign(aux,nome_aux);
        rewrite(aux);

        i:=0;
        while NOT eof(fich) do begin  // mostrar o conteúdo do ficheiro original e copiá-lo para o auxiliar
              i:=i+1;
              readln(fich,line);
              writeln('Linha ',i,': ',line);
              writeln(aux,line);
        end;
        writeln('[Fim de ficheiro]');
        close(fich);
        close(aux);
        opt2:=#13;

        {}
              write('Pretende editar uma linha? (S/N) '); readln(opt2);  // Verifica se há alterações a fazer ao ficheiro
              if upcase(char(opt2))='S' then begin   // Se Sim (S), então editar
                 write('Linha a reescrever: '); readln(j);  // Qual a linha a reescrever?
                 j:=ABS(j);  // mini-sistema de segurança (não admite nºs reais, só inteiros relativos)
                 assign(aux,nome_aux);
                 assign(fich,nome);
                 reset(aux);  // o auxiliar está pronto a ser lido
                 rewrite(fich);  // o ficheiro original é apagado
                 i:=0;
                 while NOT eof(aux) do begin
                       i:=i+1;
                       readln(aux,line);  // ler linha a linha o auxiliar
                       if (i=j) then begin   // quando i=j (linha actual em análise = linha a editar) é pedido o novo conteúdo da linha
                          writeln('A editar a linha ',j,'...');
                          writeln('Antigo conteudo: ',line);  // antigo conteúdo
                          write('Escreva novo conteudo: '); readln(line);  // novo conteúdo
                       end;
                       writeln(fich,line);  // copiar a linha do auxiliar para o original: se i=j, copiar novo conteúdo
                 end;
                 writeln('LINHA EDITADA');  // fim de edição do ficheiro
                 close(aux); close(fich);
              end;
        {}

     end
     else writeln('[Nao existe o ficheiro "',nome,'"]');  // se NÃO existe o ficheiro nomeado, é dado o alerta e a operação é calcelada

     until upcase(char(opt2))='N';  // no caso de não haver mais edições, ou não existir ficheiro, finalizar edição

     write('Prima qualquer tecla...'); readkey;
end;


begin

     repeat  // MENU PRINCIPAL

     clrscr;
     writeln('EDITOR DE TEXTO [by: Igor Nunes] [version 0.00 beta PT]');
     writeln('MENU PRINCIPAL:');
     writeln;
     writeln('1 > Criar ficheiro');
     writeln('2 > Consultar ficheiro');
     writeln('3 > Editar ficheiro');
     writeln('0 > SAIR');
     writeln;
     writeln('Caso um ficheiro nao tenha conteudos, considera-se hipoteticamente que nao existe.');
     repeat
           write('Opcao: '); readln(opt);
           case char(opt) of
                '1':criar;
                '2':consultar;
                '3':editar;
                '0':exit;
           end;
     until char(opt) in ['0'..'3'];

     until char(opt)='0';
end.