Ir ao conteúdo
  • Cadastre-se
Külhkamp

duvida: salvar no arquivo em posições diferente apartir de um vetor

Recommended Posts

bem o objetivo é, criar um vetor do tipo tcliente(record: cod,nome e idade), onde tenho que preencher cada registro e cada espaço do vetor e salvar no pc em arquivo .txt, onde que na mesma pasta deve se encontrar outro programa em console e ao iniciar-se, apareça os respectivos valores inserido no primeiro console.

fiz o cod da seguinte maneira:

prog1:

program Project1;

{$APPTYPE CONSOLE}

uses

SysUtils;

type

tpessoas=record

cod:text;

nome:text;

idade:text;

end;

var

pessoas:array[1..3] of tpessoas;

x,y,z:string;

i:integer;

ocod,onome,oidade:text;

begin

for i:=1 to 3 do

begin

assign(pessoas.cod ,'cod.txt');

assign(pessoas.nome ,'nome.txt');

assign(pessoas.idade ,'idade.txt');

{$I-}

append(pessoas.cod);

append(pessoas.nome);

append(pessoas.idade);

if ioresult <>0 then

rewrite(pessoas.cod);

writeln('digite o codigo do cliente:');

readln(x);

write(pessoas.cod,x+'_');

if ioresult <>0 then

rewrite(pessoas.nome);

writeln('digite o nome do cliente:');

readln(y);

write(pessoas.nome,y+'_');

if ioresult <>0 then

rewrite(pessoas.idade);

writeln('digite a idade do cliente:');

readln(z);

write(pessoas.idade,z+'_');

readln;

close(pessoas.cod);

close(pessoas.nome);

close(pessoas.idade);

end;

end.

prog2:

program Project2;

{$APPTYPE CONSOLE}

uses

SysUtils;

type

tpessoas = record

cod:text;

nome:text;

idade:text;

end;

var

pessoas:array[1..3]of tpessoas;

y,z,x:string;

i:integer;

begin

for i:= 1 to 3 do

begin

assign(pessoas.cod,'cod.txt');

reset(pessoas.cod);

assign(pessoas.nome,'nome.txt');

reset(pessoas.nome);

assign(pessoas.idade,'idade.txt');

reset(pessoas.idade);

while not eof(pessoas.cod) do

begin

readln(pessoas.cod,x);

writeln(x);

end;

while not eof(pessoas.nome) do

begin

readln(pessoas.nome,y);

writeln(y);

end;

while not eof(pessoas.idade) do

begin

readln(pessoas.idade,z);

writeln(z);

end;

readln;

end;

end.

e quando c roda o 1º console aparece:

----------------------

"digite o cod do cliente:"

ai digita um valor x

"digite o nome do cliente:"

ai digita um nome x

"digite a idade do cliente:"

ai digita uma idade x

--------------isso 3vezes-------

ao rodar se o 2º console DEVERIA aparecer:

--------

"cod x"

"nome x"

"idade x"

-----isso 3 vezes----

mas...

----

"cod x1/cod x2/cod x3"

"nome x1/ nome x2/ nome x3"

"idade x1/ idade x2/ idade x3"

--------isso 3 vezes-----

ql o erro do codigo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

é porque você tem 3 whiles

tire o segundo e o terceiro

while not eof(pessoas.cod) do

begin

readln(pessoas.cod,x);

writeln(x);

readln(pessoas.nome,y);

writeln(y);

readln(pessoas.idade,z);

writeln(z);

end;

Compartilhar este post


Link para o post
Compartilhar em outros sites
bem o objetivo é, criar um vetor do tipo tcliente(record: cod,nome e idade), onde tenho que preencher cada registro e cada espaço do vetor e salvar no pc em arquivo .txt, onde que na mesma pasta deve se encontrar outro programa em console e ao iniciar-se, apareça os respectivos valores inserido no primeiro console.

fiz o cod da seguinte maneira:

prog1:

program Project1;

{$APPTYPE CONSOLE}

uses

SysUtils;

type

tpessoas=record

cod:text;

nome:text;

idade:text;

end;

var

pessoas:array[1..3] of tpessoas;

x,y,z:string;

i:integer;

ocod,onome,oidade:text;

begin

for i:=1 to 3 do

begin

assign(pessoas.cod ,'cod.txt');

assign(pessoas.nome ,'nome.txt');

assign(pessoas.idade ,'idade.txt');

{$I-}

append(pessoas.cod);

append(pessoas.nome);

append(pessoas.idade);

if ioresult <>0 then

rewrite(pessoas.cod);

writeln('digite o codigo do cliente:');

readln(x);

write(pessoas.cod,x+'_');

if ioresult <>0 then

rewrite(pessoas.nome);

writeln('digite o nome do cliente:');

readln(y);

write(pessoas.nome,y+'_');

if ioresult <>0 then

rewrite(pessoas.idade);

writeln('digite a idade do cliente:');

readln(z);

write(pessoas.idade,z+'_');

readln;

close(pessoas.cod);

close(pessoas.nome);

close(pessoas.idade);

end;

end.

prog2:

program Project2;

{$APPTYPE CONSOLE}

uses

SysUtils;

type

tpessoas = record

cod:text;

nome:text;

idade:text;

end;

var

pessoas:array[1..3]of tpessoas;

y,z,x:string;

i:integer;

begin

for i:= 1 to 3 do

begin

assign(pessoas.cod,'cod.txt');

reset(pessoas.cod);

assign(pessoas.nome,'nome.txt');

reset(pessoas.nome);

assign(pessoas.idade,'idade.txt');

reset(pessoas.idade);

while not eof(pessoas.cod) do

begin

readln(pessoas.cod,x);

writeln(x);

end;

while not eof(pessoas.nome) do

begin

readln(pessoas.nome,y);

writeln(y);

end;

while not eof(pessoas.idade) do

begin

readln(pessoas.idade,z);

writeln(z);

end;

readln;

end;

end.

e quando c roda o 1º console aparece:

----------------------

"digite o cod do cliente:"

ai digita um valor x

"digite o nome do cliente:"

ai digita um nome x

"digite a idade do cliente:"

ai digita uma idade x

--------------isso 3vezes-------

ao rodar se o 2º console DEVERIA aparecer:

--------

"cod x"

"nome x"

"idade x"

-----isso 3 vezes----

mas...

----

"cod x1/cod x2/cod x3"

"nome x1/ nome x2/ nome x3"

"idade x1/ idade x2/ idade x3"

--------isso 3 vezes-----

ql o erro do codigo?

Olá,

1) Sempre que for usar código utilize a tag "CODE" (símbolo #)

2) Eu fiz alguns comentários utilizando o próprio pascal veja abaixo:

PROGRAM Project1;

type
tpessoas = record
cod :text;
nome :text;
idade:text;
end;
var
(*
PORQUE UM ARQUIVO DE TEXTO PAR CADA PESSOA ????
NAO FAZ MUITO SENTIDO. Explique isso !
*)
pessoas :array[1..3] of tpessoas;
x,y,z :string;
i :integer;
ocod,
onome,
oidade :text;


begin
for i:=1 to 3 do
begin
assign(pessoas[i].cod ,'cod.txt');
assign(pessoas[i].nome ,'nome.txt');
assign(pessoas[i].idade ,'idade.txt');

{$I-}
(*
Cada uma dessas operecoes abaixo he passivel de erro, logo, deve se
verificar o IOResult de cada uma. Lembre-se que o IOResulto retorna
a resultado da ULTIMA OPERACAO de entrada e saida.
*)
append(pessoas[i].cod);
append(pessoas[i].nome);
append(pessoas[i].idade);

(*
O IOResult CAPTA A "ULTIMA" OPERECAO DE ENTRADA E SAIDA
"IOResult = Returns the status of the last I/O operation performed."
O if abaixo estaria + ou - assim:
"se ele nao abrir "pessoas[i].idade" recrie "pessoas[i].cod", ja que
a ultima operacao de entrada e saida foi a linha acima !!! TA ERRADO !
*)
if ioresult <>0 then
rewrite(pessoas[i].cod);

writeln('digite o codigo do cliente:');
readln(x);
write(pessoas[i].cod,x+'_');

(*
Mesma situacao acima!!! O IOResult esta sendo usado de forma incorreta
*)

if ioresult <>0 then
rewrite(pessoas[i].nome);
writeln('digite o nome do cliente:');
readln(y);
write(pessoas[i].nome,y+'_');

(*
Mesma situacao acima!!! O IOResult esta sendo usado de forma incorreta
*)
if ioresult <>0 then
rewrite(pessoas[i].idade);
writeln('digite a idade do cliente:');
readln(z);
write(pessoas[i].idade,z+'_');

readln;


close(pessoas[i].cod);
close(pessoas[i].nome);
close(pessoas[i].idade);
end;
end.

3) Eu acho que você deveria reestruturar esse algoritmo.

Minha sugestão seria a seguinte:

a) usar um vetor de tCliente (você usou tPessoas, mas dá no mesmo) utilizando os tipos correspondentes deles mesmo, e não como um "text". Não faz sentido ter um arquivo de texto para cada palavra!!

Ficaria assim:

cod   = string; (ou qualquer tipo mais apropriado)
nome = string;
idade = integer; (ou byte)

E o vetor ficaria da mesma forma

vClientes : array [1..3] of tClientes;

... ou seja, eu tenho um vetor de "Clientes" e não um vetor de "ARQUIVOS de cada dado do cliente". Entendeu a diferença? (seria um vetor normal de clientes, como se não existisse arquivos.)

B) Com a estrutura acima, bastaria ter somente um arquivo (o mais correto) para todo os clientes, ex: Clientes.txt.

Ai teria que escolher um modo para escrever os dados neste arquivo. Repare que para todos os dados escritos tem que se observar como recuperar esse dado. "Não existe armazenamento sem recuperação" isso é um conceito!.

Eu sugiro duas formas:

Uma seria colocar cada dado um embaixo do outro. Ficaria assim:

Clientes.txt

1
EstilingueAtomico
26
2
Külhkamp
20

Ai na hora de recuperar bastava seguir a mesma seqüência: cod, depois nome e por fim a idade. Bem simples não? :lol:

Ou do jeito mais difícil.

Colocando um no lado do outro, para este você deveria colocar alguma coisa que marque onde termina e onde começa cada novo cliente. Dá mais trabalho, e nem vou entrar neste mérito no momento. Aconselho a primeira opção mesmo!!

Com essas informações acredito que consiga fazer um algoritmo mais aprimorado. Faça e poste aqui, que ajudo com as correções. E vou dando dicas de acordo com sua evolução.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×