Jump to content
vsilvanf

Arquivo Tipado - Pascal

Recommended Posts

vsilvanf

Fala galera...sou novo em pascal e preciso de uma ajuda para desenvolver o seguinte programa.

Um programa em Pascal que leia um arquivo do tipo string (apenas palavras), exiba o conteúdo do arquivo em tela, e logo depois inverta as linhas, e por fim inverta também os caracteres de cada linha.

Por exemplo:

Escrever o Arquivo Original em tela:

Linha A

Linha B

Linha C

Logo Depois Inverter as linhas:

Linha C

Linha B

Linha A

E por fim inverter as linhas e as palavras:

C ahniL

B ahniL

A ahniL

Cheguei até aqui:

Type
Palavra = string[60];
Arquivo = File of Palavra;
Var
Dados         : Arquivo;
Imprimir o arquivo original:
    assign(Texto, 'c:\1.txt');
    reset(Texto);
    while not eof(Texto) do
    begin
        read(Texto, Linha);
        writeln(Linha);
    end;
Para imprimir as linhas ao contrario tentei assim(Mas não consegui, o programa nem roda, compila mas dá erro e não roda):
    assign(Texto, 'c:\1.txt');
    reset(Texto);
    for i:=filesize(Texto) downto 1 do
    begin
        seek(Texto, i);
        read(Texto,Linha);
        writeln(Linha);
    end;

Para inverter as linhas e palavras não consegui nada, pq nem consegui inverter as linhas.

PS: Utilizo o Dev-Pascal.

Obrigado Galera.

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
thoga31

Bem-vindo.

Não chega dizer que tens um erro, deves dizer exactamente qual é o erro que estás a obter.

Estás a obter erro pois não se pode usar readln e writeln com ficheiros binários, como estás a tentar fazer (File Of). Tens a certeza que deves fazer um file of string? Não será um text?


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

Para começar, uma coisa a perceberes:

O Assign só se usa uma vez para cada variável de ficheiro.

No inicio do programa fazes o Assign e depois é só usar o ficheiro, não voltas a atribuir nada.

Depois, há muitas formas de fazer o que pretendes. A mais simples será por ventura, usar um array.

Lês todo o ficheiro para um Array, e memorizas quantas frases tens ao todo (vais incrementando um contador a cada leitura do ficheiro).

Convém que leias o ficheiro com o Readln, e não com o Read. Caso contrário, ele vai assumir que as palavras são separadas a cada 60 caracteres (tamanho do registo que lhe indicas) e não a cada nova linha.

Tendo todas as palavras no array, depois é só usar o FOR (com a característica DOWNTO em vez de TO) para tudo o resto.

Um FOR DOWNTO DO para leres o ARRAY do fim para o principio, e escreveres as linhas no ecrã.

Depois, outro FOR DOWNTO DO para leres as palavras de forma invertida (usa o LENGTH para saberes o tamanho das palavras).

Tens a certeza que deves fazer um file of string? Não será um text?

Há compiladores que não têm o TEXT, e nesse caso é File of String.

Não sei se é o caso, que mal testei o Dev-Pascal, mas é possível!


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
thoga31

O Dev-Pascal usa uma versão antiga do Free Pascal, mas a última versão dele (descontinuada) tem suporte a text.

Eu tenho na versão 2.6.0 do FPC e não consigo utilizar readln nem writeln com ficheiros binários. Tive de utilizar métodos alternativos.


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

O Dev-Pascal usa uma versão antiga do Free Pascal, mas a última versão dele (descontinuada) tem suporte a text.

Eu tenho na versão 2.6.0 do FPC e não consigo utilizar readln nem writeln com ficheiros binários. Tive de utilizar métodos alternativos.

Ficheiros binários?


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
thoga31

Estas designações podiam ser uniformizadas, mas enfim.

Ficheiro binário ou ficheiro tipado ou um ficheiro declarado com file of tipo. ;)


Knowledge is free!

Share this post


Link to post
Share on other sites
vsilvanf

Boa tarde thoga31 obrigado a ajuda.

Na hora de compilar com o dev pascal não da erro não, ae coloco executar e abre a tela do prompt e ja fecha automaticamente, como se chegasse em uma determinada linha e achasse um erro de execução(por testes acho que é quando chega no seek).

Para ler uso o read e não o readln(pq ja tentei usar e da erro mesmo). So uso o writeln para escrever a variavel linha, que esta definida como string.

E infelizmente tem que ser com arquivo tipado mesmo, pois pedem que seja (preferiria o tipo text também).

Abraços.

Edited by vsilvanf

Share this post


Link to post
Share on other sites
nunopicado

Boa tarde Stack Overflow obrigado a ajuda.

Stack Overflow?


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
thoga31

O nosso @nunopicado anda enferrujado :D

Não se pode utilizar readln e writeln com ficheiro binários, apenas se pode utilizar read e write uma vez que, num ficheiro destes, não há noção de New Line.

@vsilvanf, coloca o código inteiro para podermos ver o que pode estar a correr mal.


Knowledge is free!

Share this post


Link to post
Share on other sites
vsilvanf

Boa tarde nunopicado, obrigado a ajuda também.

Com relação ao Assign entendi o que você disse.

Não entendi a parte do Readln, você quer dizer ler o texto usando o Readln e não o read? Mas não dá erro ? Testei aqui e não consegui.

E quanto ao array você diz que cada linha que eu ler, gravar em um array, e apos gravado no array ler ele de traz para frente e invertendo os caracteres?

Bom acho que vou realizar uns testes com essa dica, e volto a retornar pro forum.

Abraços.

Share this post


Link to post
Share on other sites
thoga31

A ideia do seek é boa e mais eficiente, a meu ver. Tens é um problema: seek é zero-based, o que significa que, para te posicionares no último elemento do ficheiro, tens de fazer isto:

seek(ficheiro, FileSize(ficheiro) - 1);

Aposto que é aqui que te ocorre o erro, não é preciso tanta volta com arrays.

Edited by thoga31
  • Vote 1

Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

O Readln funciona em TEXT. Em File Of efectivamente não.

Já lá vão uns valentes anos desde que usei isto para ler ficheiros (TStringList, o meu grande amor! lol)


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
vsilvanf

Thoga31 Também achei que o erro era do seek, mas tentei como você disse(segue abaixo) só que imprimi na ordem normal, não inverte as linhas não.

 assign(Dados, 'c:\1.txt');
 reset(Dados);
 for i:=(filesize(Dados)- 1) downto 0 do
 begin
	 seek(Dados, i);
	 read(Dados,PalavraLida);
	 writeln(PalavraLida);
 end;

To quase partindo para o array mesmo :/

Edited by nunopicado
Adicionada linguagem GeShi

Share this post


Link to post
Share on other sites
thoga31

Acho que esse código está correcto. Se agora houver problemas, será noutra parte.


Knowledge is free!

Share this post


Link to post
Share on other sites
passarito

Boas,

Sim o array será mais fácil, mas penso que objectivo é trabalhares os ficheiros.

O código está correcto, para verificares, altera o writeln para

writeln(i,' - ',palavralida);

isto vai-te indicar o número da posição do ficheiro para a qual ele escreve a linha

Share this post


Link to post
Share on other sites
pwseo

vsilvanf,

Por vezes parece-me que tens dificuldade em explicar o que pretendes fazer -- tenho sérias dúvidas relativamente a ser necessário utilizar um file of string, por exemplo. Continuando, quando queremos ler strings de um ficheiro, utilizamos o tipo de dados text (ou textfile) que nos permite utilizar as readln e writeln sem termos que nos preocupar nós mesmos com os caracteres de mudança de linha.

Utilizar seek em ficheiros de texto não é exequível, uma vez que não é possível determinar onde começa a linha seguinte (ou anterior) sem ler todos os caracteres até lá. Essa técnica funciona para estruturas de dados com tamanho bem definido. Claro que se a nossa definição de linha for string[60], então podemos utilizar seek, mas se for esse o caso, todo o exercício acaba por me parecer inútil.

Por isso, encorajo-te a investigar a solução já mencionada: crias uma array de strings, para a qual lês o conteúdo do ficheiro em questão. Posteriormente modificas o conteúdo dessa array ao teu gosto, invertendo primeiro a ordem das strings, e depois a ordem dos próprios caracteres.

Share this post


Link to post
Share on other sites
vsilvanf

Pessoal

Fiz das 2 formas utilizando os array e utilizando o arquivo.

Queria Agradecer a ajuda de todo mundo ae.

Obrigadão

Share this post


Link to post
Share on other sites
Suelen Passos
program inverte(input{teclado}, output{tela}, dados{e/s});
type
  Palavra = string[30];
  ArqDePalavras = file of Palavra;
procedure mostrar(var a{e}: ArqDePalavras);
  var
     reg: Palavra;
     pos: integer;
  begin
     reset(a);
     pos:= 0;
     while not eof(a) do
        begin
           read(a, reg);
           writeln(output, 'Registro ', pos:2, ': ', reg);
           pos:= pos+1;
        end;
     writeln(output);
     close(a);
  end;
function invertePalavra(pal{e}: Palavra): Palavra;
  begin
     if pal='' then invertePalavra:=''
     else invertePalavra:= invertePalavra(copy(pal, 2, length(pal)))+pal[1];
  end;
procedure trocar(var a{e/s}: ArqDePalavras; x{e},y{e}: integer);
  var
     registro, temp: Palavra;
  begin
     seek(a,x);
     read(a, registro);
     seek(a,y);
     read(a, temp);
     seek(a,y);
     write(a, invertePalavra(registro));
     seek(a,x);
     write(a, invertePalavra(temp));
  end;
procedure inverter(var a{e/s}: ArqDePalavras);
  var
     atual: integer;
  begin
     reset(a);
     for atual:= 0 to (filesize(a)-1) div 2 do
        begin
           trocar(a, atual, filesize(a)-1-atual);
        end;
     close(a);
  end;
procedure produzAleatorio(var a{e/s}: ArqDePalavras);
  var
     posicao, letra: integer;
     gerada:  Palavra;
  begin
     rewrite(a);
     for posicao:= 0 to random(10)+1 do
        begin
            gerada:= '';
            for letra:= 1 to random(25)+1 do
               gerada:= gerada+chr(65+random(10));
            write(a, gerada);
        end;
     close(a);
  end;
var
  dados: ArqDePalavras;
  nome: string;
begin
  write(output, 'Nome do arquivo: ');
  readln(input, nome);
  assign(dados, nome);
  randomize;              {para teste - nao cobrado}
  produzAleatorio(dados); {para testar - nao cobrado};
  mostrar(dados);
  inverter(dados);
  mostrar(dados);
  readln(input);
end.

Edited by nunopicado
Adicionada linguagem GeShi

Share this post


Link to post
Share on other sites
thoga31

Uma vez que o membro @vsilvanf não teve a amabilidade de fornecer a solução, fica esta para referência futura. Obrigado, @Suelen Passos.

(Nota: ao contrário do outro tópico, neste caso a colocação do código é aceitável uma vez que o OP do tópico desertou sem partilhar a solução que encontrou ;) )

Edited by thoga31

Knowledge is free!

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.