Arquivos em Pascal

1. Arquivos em Pascal

Jessica Dias Rodrigues
jeh_dias

(usa Ubuntu)

Enviado em 02/04/2013 - 10:32h

Olá , bom dia .

Eu tenho uma imagem (chuck.pgm) e vou trabalhar com arquivos . A matriz desta imagem tem na primeira linha dois caracteres , a partir da segunda linha só tem números .


Vou colar algumas linhas da matriz .

P2
200 200
255
219 220 223 227 230 230 226 221 218 218 202 210 201 187 212 227 224
235 225 210 214 215 210 215 214 195 175 165 160 161 180 200 228
229 227 222 216 216 221 227 221 219 214 237 138 4 10 2 2
2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 4 8 7 11 33 58 78

A questão é , quando associo uma variável ao arquivo , estou declarando-a como string e após a segunda linha chamo a função Val e converto essa variável string para integer . Posso estar usando a função Val errada , porém não obtenho sucesso . Não consigo escrever a imagem depois .

A melhor metodologia seria essa ? Ou tem alguma outra mais fácil ?

Aqui está o que já fiz .

Program desafio;

Const lin = 200;
Var
arq : text ;
i,j,k,percorre,erro :integer;
mat : array[1..200,1..200] of integer;
leitura:string;
Begin
erro := 0;
assign(arq,'chuck.pgm');
reset(arq);
while not Eof(arq) do
begin
readln(arq,leitura);
for i:=1 to length(leitura) do
begin
if (leitura[1] = 'p2')then
// Nesta linha quero verificar se a variável esta na
// primeira linha , mas quando incrementar o for e o i = 2 , leitura estará na posição 2 e não 1 . Se colocar leitura[i] = 'p2' o problema será o mesmo . Não consegui resolver este problema .
begin
Val(leitura[i+1],percorre,erro);
// Chamo a função a partir da segunda linha , porém não sei se posso fazer leitura[i+1];
readln(arq,percorre);
for j:=1 to lin do
for k:=1 to lin do
begin
readln(arq,mat[j,k]);
writeln(mat[j,k]);
end;
end;
end;
end;
close(arq);
readln;
end.

Obrigada .



  


2. Re: Arquivos em Pascal

Ton Melo
IZhaq_Melo

(usa FreeBSD)

Enviado em 02/04/2013 - 11:08h

jeh_dias escreveu:

Olá , bom dia .

Eu tenho uma imagem (chuck.pgm) e vou trabalhar com arquivos . A matriz desta imagem tem na primeira linha dois caracteres , a partir da segunda linha só tem números .


Vou colar algumas linhas da matriz .

P2
200 200
255
219 220 223 227 230 230 226 221 218 218 202 210 201 187 212 227 224
235 225 210 214 215 210 215 214 195 175 165 160 161 180 200 228
229 227 222 216 216 221 227 221 219 214 237 138 4 10 2 2
2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 4 8 7 11 33 58 78

A questão é , quando associo uma variável ao arquivo , estou declarando-a como string e após a segunda linha chamo a função Val e converto essa variável string para integer . Posso estar usando a função Val errada , porém não obtenho sucesso . Não consigo escrever a imagem depois .

A melhor metodologia seria essa ? Ou tem alguma outra mais fácil ?

Aqui está o que já fiz .

Program desafio;

Const lin = 200;
Var
arq : text ;
i,j,k,percorre,erro :integer;
mat : array[1..200,1..200] of integer;
leitura:string;
Begin
erro := 0;
assign(arq,'chuck.pgm');
reset(arq);
while not Eof(arq) do
begin
readln(arq,leitura);
for i:=1 to length(leitura) do
begin
if (leitura[1] = 'p2')then
// Nesta linha quero verificar se a variável esta na
// primeira linha , mas quando incrementar o for e o i = 2 , leitura estará na posição 2 e não 1 . Se colocar leitura[i] = 'p2' o problema será o mesmo . Não consegui resolver este problema .
begin
Val(leitura[i+1],percorre,erro);
// Chamo a função a partir da segunda linha , porém não sei se posso fazer leitura[i+1];
readln(arq,percorre);
for j:=1 to lin do
for k:=1 to lin do
begin
readln(arq,mat[j,k]);
writeln(mat[j,k]);
end;
end;
end;
end;
close(arq);
readln;
end.

Obrigada .


veja se isso ajuda:
http://www.inf.pucrs.br/~fldotti/lapro1/arq.htm

tente ser mais específico com suas perguntas, isso nos ajuda muito.
tente escrever trechos de código, caso não consiga numero o código postado, fica mais fácil dar suporte debbugando.

pelo que me parece o seu problema é de lógica.




3. Re: Arquivos em Pascal

Jessica Dias Rodrigues
jeh_dias

(usa Ubuntu)

Enviado em 02/04/2013 - 11:14h

Não consigo acessar esta página .

No caso você não entendeu as minhas dúvidas porque não fui específica ?

Ao invés de postar as linhas de código com problema , postei o código todo ?


4. Re: Arquivos em Pascal

Paulo
paulo1205

(usa Ubuntu)

Enviado em 02/04/2013 - 16:04h

Você realmente não foi clara, no texto descritivo da sua mensagem, sobre qual problema está tentando resolver e qual dificuldade está tendo.

Não há problemas em postar o código todo. Aliás, algumas das dúvidas que não ficaram claras na descrição aparecem ao se ler o código. Mas teria sido melhor se você o tivesse postado com uma apresentação mais fácil de ler. Experimente editar sua postagem original, cercando o código do programa com as tags "[code]" e "[/code]".

Com relação ao programa, acho que você está se perdendo um pouco no algoritmo. Olhando a descrição do formato PGM (que existe, por exemplo, em http://netpbm.sourceforge.net/doc/pgm.html), tal descrição é mapeia quase diretamente o algortimo que você deveria implementar.

Eu estou meio enferrujado em Pascal e não tenho como fazer testes aqui (minha "praia" é C, e uma das críticas mais fortes do pessoal de C em cima de Pascal é justamente a respeito da forma de lidar com arquivos), mas acho que você deveria usar Read(), e não ReadLn(), para ler valores de nível de cinza em cada pixel, pois a descrição de ReadLn() diz que ele pula para a próxima linha depois de ler os valores dos argumentos especificados, e eu temo que isso possa provocar uma porção de decartes de valores que seu programa deveria ler. Talvez alguém que lide com Pascal com mais frequência possa esclarecer essa dúvida.

Você vai ler sempre e somente o arquivo cujas primeiras linhas você colocou, ou pode ter de ler qualquer PGM? Um PGM genérico pode conter linhas de comentários, cuja presença vai complicar significativamente o seu algoritmo de leitura -- e especialmente a implementação em Pascal padrão.


5. Re: Arquivos em Pascal

Ton Melo
IZhaq_Melo

(usa FreeBSD)

Enviado em 02/04/2013 - 17:07h

jeh_dias escreveu:

Não consigo acessar esta página .

No caso você não entendeu as minhas dúvidas porque não fui específica ?

Ao invés de postar as linhas de código com problema , postei o código todo ?


voce deve ta usando o Chrome né? rss

tente via webcache do google:

http://webcache.googleusercontent.com/search?q=cache:0P9CjDgwu5UJ:www.inf.pucrs.br/~fldotti/lapro1/a...

se nao der procure o link e o acesse diretamente.
la tem um exemplo de código de acesso a arquivos de formas bem objetiva e clara.




6. Re: Arquivos em Pascal

Jessica Dias Rodrigues
jeh_dias

(usa Ubuntu)

Enviado em 02/04/2013 - 21:40h

Há uma variável para o arquivo , esta lê a imagem pgm inteira sem algum tipo de inserção do usuário .

A questão da primeira linha que coloquei , era a variável ler a palavra que esta na primeira linha e depois transformá-la para ler os números .

Estou abrindo o arquivo que contém a imagem pgm . A dúvida esta na variável que vai realizar a leitura da imagem . A imagem possui palavra e números , como faço para lidar com esta diferença de dados ?

Eu retirei os comentários da imagem . Entendi a ideia de read e readln , efetuei a troca .

Isso estava usando o google , mas consegui abrir depois . Obrigada pela dica .




7. Re: Arquivos em Pascal

Ton Melo
IZhaq_Melo

(usa FreeBSD)

Enviado em 03/04/2013 - 08:04h

jeh_dias escreveu:

Há uma variável para o arquivo , esta lê a imagem pgm inteira sem algum tipo de inserção do usuário .

A questão da primeira linha que coloquei , era a variável ler a palavra que esta na primeira linha e depois transformá-la para ler os números .

Estou abrindo o arquivo que contém a imagem pgm . A dúvida esta na variável que vai realizar a leitura da imagem . A imagem possui palavra e números , como faço para lidar com esta diferença de dados ?

Eu retirei os comentários da imagem . Entendi a ideia de read e readln , efetuei a troca .

Isso estava usando o google , mas consegui abrir depois . Obrigada pela dica .



hummm tudo esta ficando mais claro.

conversão de tipos de dados:
achei um exemplo sucinto:


function IntToHex(Value: Integer; Digits: Integer): string; overload;
function IntToHex(Value: Int64; Digits: Integer): string; overload;
function IntToStr(Value: Integer): string; overload;
function IntToStr(Value: Int64): string; overload;
function StrToInt(const S: string): Integer;
function StrToIntDef(const S: string; Default: Integer): Integer;
function StrToInt64(const S: string): Int64;
function StrToInt64Def(const S: string; Default: Int64): Int64;
function StrToCurr(const S: string): Currency;
function StrToDate(const S: string): TDateTime;
function StrToDateTime(const S: string): TDateTime;
function StrToFloat(const S: string): Extended;
function StrToTime(const S: string): TDateTime;
function FloatToStr(Value: Extended): string;
function FloatToStrF(Value: Extended; Format: TFloatFormat; Precision, Digits: Integer): string;
function TimeToStr(Time: TDateTime): string;
function DateTimeToStr(DateTime: TDateTime): string;


agora so falta um código exemplo, para sanarmos a sua dúvida.

para saber um pouco mais de conceitos:

fonte: http://www.devmedia.com.br/forum/conversao-de-dados-no-turbo-pascal/249040

ahh e quanto ao WebCache do Google verá que é bem util inclusive com páginas que ja foram deletadas e o Srº Google "Gualdah", tem firewalls que não conseguem bloquear essas páginas, ( é algo util ).

caso os links não tenha te ajudado, post um código exemplo para trabalharmos no que você tem em mente/papel.

OBS: coloque o seu código dentro de (abre colchetes)CODE] (abre colchetes)/CODE] tudo em caixa baixa fica fácil visualizar melhor.

fonte: http://www-di.inf.puc-rio.br/~rangel/lp/LP4.PDF


8. Re: Arquivos em Pascal

Jessica Dias Rodrigues
jeh_dias

(usa Ubuntu)

Enviado em 03/04/2013 - 13:47h


program desafio;

const lin = 200;
var
arq : text ;
i,j,k,percorre,erro,n :integer;
mat : array[1..200,1..200] of integer;
leitura:string;
begin
erro := 0;
assign(arq,'icone.pgm');
reset(arq);
read(arq,leitura);
// Estava tentando o obter o tamanho da variavel que esta
lendo o arquivo
n := filesize(arq);
write(n);
// Verifico se existe p2 e o comentario na imagem , para
verificar se é imagem pgm
if ((leitura[1] = 'p2')and (leitura[2] = '#')) then
begin
write('É uma imagem pgm ! ');
while not Eof(arq) do
begin
for i:=1 to length(leitura) do
begin
// Estou usando a função para conversão Val(leitura[i],percorre,erro); read(arq,percorre);
end;
for j:=1 to lin do
for k:=1 to lin do
begin
read(arq,mat[j,k]);
// Supostamente iria escrever a matriz , ou seja , a imagem .
writeln(mat[j,k]);
end;
end;
end
else
writeln ( ' Imagem não está no formato correto ! ' );
close(arq);
end.


O read(arq,percorre); é a linha abaixo da chamada da função Val , o percorre já seria uma variável inteira e percorreria o resto da matriz .


9. Re: Arquivos em Pascal

Paulo
paulo1205

(usa Ubuntu)

Enviado em 04/04/2013 - 05:51h

Julgando que filelength() devolva um tamanho em bytes, e dado que o formato do PGM do tipo "P2" utiliza representação em texto dos valores numéricos de cada pixel, eu diria que sua lógica de controle está errada.

Como eu disse antes, se não fosse pela presença possível de comentários em qualquer lugar do arquivo, o parser seria muito simples de fazer, com apenas um ReadLn() para o cabeçalho, um Read() para as dimensões da imagem e para o valor correspondente ao branco, e depois um loop para ler a matriz de pixels, usando Read().

Existindo comentários, essa simplicidade diminui. Você passaria a ter de, após ler o cabeçalho, ler até o final do arquivo de linha em linha de texto, guardando cada linha inteira numa string. Então, para cada linha lida, você teria de separar a string em partes (por exemplo, considerando espaços e tabulação como separadores), e ir testando, em ordem, cada parte, para ver se aparece o sinal de comentário (que a autorizaria a seguir diretamente para a linha seguinte), ou se ela contém um valor que você consiga converter para inteiro, que você usaria para alimentar os valores das dimensões da matriz, do valor correspondente ao branco, e, finalmente, do tom de cinza de cada pixel.


10. Re: Arquivos em Pascal

Jessica Dias Rodrigues
jeh_dias

(usa Ubuntu)

Enviado em 10/04/2013 - 13:43h

Houve uns imprevisto , ai não consegui responder antes .

Eu mudei todo código , pois aquela maneira seria muito complicada para resolver .

Então coloquei três variáveis , uma string para ler o comentário , outra para ler a dimensão e outra para ler a cor . E não precisei fazer a transformação de string para integer .
Logo após associo o arquivo com a matriz da imagem . Agora só preciso fazer o método da ampliação da imagem e depois escrever a matriz ampliada em um arquivo .


Program ampliacao;

Var
arq,arq2 : text ;
i,j,dim,dim2,cor :integer;
mat : array[1..1000,1..1000] of integer;
leitura,leitura2,imagem,comentario : string[255];
Begin


writeln( '=============================================================');
writeln( ' AMPLIAÇÃO DE IMAGEM ');
writeln( '=============================================================');

writeln(' Entre com o nome da imagem : ');// Entrando com o nome da imagem p/ ser ampliada
readln(imagem);

// Começando a trabalhar com arquivo
assign(arq,imagem);
reset(arq);
readln(arq,leitura);
if(leitura = 'P2')then
begin
writeln(' É uma imgem pgm . ' );
// Leitura do comentario , dimensão e cor
readln(arq,comentario);
readln(arq,dim,dim2);
readln(arq,cor);
// Associando o arquivo com a matriz
for i:= 1 to dim do
for j:= 1 to dim2 do
read(arq,mat[i,j]);
end
else
writeln('Esta imagem não é pgm .');

// Escrita do comentario ,dimensao e cor da imagem
writeln(comentario);
writeln(dim,' ',dim2);
writeln(cor);


// Realizando o processo de ampliacao
{for i:=1 to dim do
for j:=1 to dim2 do
begin
mat[i,j] := i * 2;
mat[i,j] := j * 2;
end;}



// Abrindo outro arquivo
{assign(arq2,'test2.pgm');
readln(arq2,leitura2);
close(arq2);
writeln(arq2,mat[i,j]);}
// Escrevendo a matriz
for i:= 1 to dim do
for j:= 1 to dim2 do
begin
write(mat[i,j],' ');
if (j = dim2) then
writeln;
end;
close(arq);
end.



11. Re: Arquivos em Pascal

Paulo
paulo1205

(usa Ubuntu)

Enviado em 10/04/2013 - 14:28h

jeh_dias escreveu:

Houve uns imprevisto , ai não consegui responder antes .

Eu mudei todo código , pois aquela maneira seria muito complicada para resolver .

Então coloquei três variáveis , uma string para ler o comentário , outra para ler a dimensão e outra para ler a cor . E não precisei fazer a transformação de string para integer .
Logo após associo o arquivo com a matriz da imagem . Agora só preciso fazer o método da ampliação da imagem e depois escrever a matriz ampliada em um arquivo .


Note que isto está "errado", na medida em que você está assumindo que o comentário vai sempre existir e sempre estar na mesma posição. De acordo com o link que eu indiquei sobre a documentação do formato, um ou mais comentários podem acontecer ou não em qualquer ponto do arquivo depois da assinatura ("P2" na primeira linha).


12. Re: Arquivos em Pascal

Jessica Dias Rodrigues
jeh_dias

(usa Ubuntu)

Enviado em 11/04/2013 - 07:48h

Concordo , porém para este meu trabalho todas as imagens a serem ampliadas só possuem um comentário , após P2 . Por isso colocar uma variável para comentário .






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts