Ir ao conteúdo
  • Cadastre-se
claudiojz

I/O erro 104

Recommended Posts

olá pessoal

estou enfrentando esse problema de I/o erro 104 no seguinte codigo:


nomedolog := 'C:\vetor.txt';
AssignFile(Arquivo, nomedolog);
reset(arquivo);
tam:=0;
while not Eof (arquivo) do //enquanto não for final do arquivo texto
begin
i:=1;
Readln(Arquivo, aposta); //lê o arquivo uma linha
str := Copy ( aposta, 1, 2 ); //copia a posição x duas casas
vetor[j,i]:=strtoint(str); //adiciona ao vetor apost
i:=i+1;
str := Copy ( aposta, 5, 2 );
vetor[j,i]:=strtoint(str);
i:=i+1;
str := Copy ( aposta, 9, 2 );
vetor[j,i]:=strtoint(str);
i:=i+1;
str := Copy ( aposta, 13, 2 );
vetor[j,i]:=strtoint(str);
i:=i+1;
str := Copy ( aposta, 17, 2 );
vetor[j,i]:=strtoint(str);
i:=i+1;
str := Copy ( aposta, 21, 2 );
vetor[j,i]:=strtoint(str);
j:=j+1;
tam:=tam+1; // conta o total de linha do arquivo
end;
CloseFile(Arquivo); //fecha o arquivo

esse codigo lê um txt de 11 linhas, e o while leu 7 linha na 8ª vez ele retorna o erro I/o 104. Se eu diminui o txt para 6 linhas não dá problemas. O que pode ser? Me judem por favor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

:confused:

Pelo que foi passado não deu para ver muita coisa, mas acredito que pode ser duas coisas: ou o na variável "j", que não sei que os limites do vetor ou o arquivo está mal estruturado, assim não comportando o que a "aposta" busca!...

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá EstiligueAtomico e demais

estou quebrando a cabeça para resolver esse problema mas não estou conseguindo. Anexei a procedure completa que fiz para simular o serteio de seis nº e comparar em um arquivo txt com n apostas de 6 números também.

se o código está meio confuso podem criticar, estou aberto para sugestões

o arquivo txt recebe apostas que ficam armazenadas neste formato:

00 00 00 00 00 00

00 00 00 00 00 00


procedure Tfrmprojloteria.sortearClick(Sender: TObject);
var
Sortear : TextFile;
nomedolog,aposta,s, str, linha: String;
apost:array[1..6,1..10] of integer;
sort: array[1..6] of integer;
i,j,z,c,rand,tam,conf,x,y,acer:integer;
aval:boolean;
begin
memo1.lines.Clear;
Randomize; //inicia a função randomize
c:=1;
//sorteando números
repeat
aval:=true;
rand:=(random(60));
i:=1;
while(i<=c) do
begin
if (rand=0) then
begin
aval:=false;
i:=i+1;
end;
if (rand=sort[i]) then
aval:=false;
i:=i+1;
end;
if (aval=true) then
begin
sort[c]:= rand;
c:=c+1;
end;

until (c=7);

//ordenando números sorteados

for i:=1 to 6 do
for j:=i+1 to 6 do
if sort[i]>=sort[j] then
begin
z:=sort[i];
sort[i]:=sort[j];
sort[j]:=z;
end;

// imprimindo os números sorteados
Memo1.Lines.add('Simulação de Sorteio:');
for i:=1 to 6 do
begin
s := s + inttostr(sort[i])+' ';
end;
Memo1.Lines.add(s);
Memo1.Lines.add('resultados');
//verificando os acertos
//memo1.Lines.Clear;
nomedolog := 'C:\vetor.txt';
AssignFile(Sortear, nomedolog);
reset(Sortear);
tam:=0;
x:=1;
while not Eof (Sortear) do //enquanto não for final do arquivo texto
begin
y:=1;
Readln(Sortear, aposta); //lê o arquivo uma linha
str := Copy ( aposta, 1, 2 ); //copia a posição x duas casas
apost[x,y]:=strtoint(str); //adiciona ao vetor apost
y:=y+1;
str := Copy ( aposta, 5, 2 );
apost[x,y]:=strtoint(str);
y:=y+1;
str := Copy ( aposta, 9, 2 );
apost[x,y]:=strtoint(str);
y:=y+1;
str := Copy ( aposta, 13, 2 );
apost[x,y]:=strtoint(str);
y:=y+1;
str := Copy ( aposta, 17, 2 );
apost[x,y]:=strtoint(str);
y:=y+1;
str := Copy ( aposta, 21, 2 );
apost[x,y]:=strtoint(str);
x:=x+1;
//tam:=tam+1; // conta o total de linha do arquivo
end;
CloseFile(Sortear); //fecha o arquivo
conf:=1;

for j:=1 to x do //carrega a linha
begin
linha := ''; //inicia uma linha de nº apostados
acer:=0;//inicia o acerto
for i:=1 to 6 do //carrega as colunas
begin
linha := linha + inttostr(apost[j,i])+' '; //monta uma linha de nº apostados
conf:=1;
while(conf<7) do //garante um loop de 6 vezes
begin
if(sort[conf]=apost[j,i]) then //se o nº sorteado for igual ao nº apostada
begin
acer:=acer+1; //soma os acertos
end;


conf:=conf+1; // incrementa o loop do while
end; // fim do while

end;// fim do for i
Memo1.Lines.add(linha +'->'+ inttostr(acer)); //imprime os nº apostados e a qtde de acertos
end; //fim do for j

end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Encontrei um erro básico!

.
.
apost:array[1..6,1..10] of integer;
.
.

x:=1;

while not Eof (Sortear) do //enquanto não for final do arquivo texto
begin
.
.
apost[x,y]:=strtoint(str);
.
.
x:=x+1;
.
.

Repare que x:=x+1 só será válido até que x valha 6 !!!, pois "apost" só vai até [6,Y] !!!! No 7 loop vai ultrapassar o limite... ajuste isso, você está invertendo o X com o Y... Y que tem q ir até 6, e não 10 !!!

Outra coisa que eu acho que pode da erro é na String "aposta', se não me engano ele deveria ter o tamanho da linha, ou seja, String[18].

Tem outras coisa pra corrigir!!!

1) Você está gerando o número de modo errado!!!

memo1.lines.Clear;

Randomize; //inicia a função randomize
c:=1;
//sorteando números
repeat
aval:=true;
rand:=(random(60));
i:=1;
while(i<=c) do
begin
if (rand=0) then //[YEA] esse if seria fora, justamente para dps
//[YEA] verificar se já existe!!!
begin
aval:=false; //[YEA] OK
i:=i+1; //[YEA] Tá errado, o "i" é só para vê se já existe!!!
//[YEA] Assim não vai verifica alguns linhas dps!!!
end;
//verifica se já existe
if (rand=sort[i]) then
aval:=false;
i:=i+1;
end;
if (aval=true) then
begin
sort[c]:= rand;
c:=c+1;
end;

until (c=7);

Está meio complicado para explicar os erros do código acima, até porque um erro está levando a outro... um código mais correto seria assim.

Randomize; //inicia a função random()

//sorteia o 1º número
sort[1]:=random(60); //sempre é válido!!!

//soteia os número seguintes
c:=1;
repeat
aval:=true;
rand:=random(60);

//verifica se já existe (recomendo ser uma sub-função, dentro desta)
for i:=1 to c do
begin
//compara com a posição atual
if (rand=sort[i]) then
begin
aval:=false;
break; //finaliza o for
end;
end; //fim for

//verifica se o número foi validado
if (aval=true) then
begin
inc(c); //c:=c+1;
sort[c]:=rand;
end;
until (c>=6);

Não testei, mas acho que é isso ai!!!

2) Só aprimorando a ordenação.

Está assim:

     //ordenando números sorteados

for i:=1 to 6 do //[YEA] tem q ter o -1 !!! - no "j", 6+1=7 ???
for j:=i+1 to 6 do
if sort[i]>=sort[j] then
begin
z:=sort[i];
sort[i]:=sort[j];
sort[j]:=z;
end;

O Correto seria

//ordenando números sorteados
for i:=1 to 6-1 do
for j:=i+1 to 6 do
if sort[i]>=sort[j] then
begin
temp:=sort[i]; //mude "z" para um nome mais claro
sort[i]:=sort[j];
sort[j]:=temp;
end;

beleza?

veja o q concorda comigo e ajuste o código. Veja se o erro continua.

Por favor, volte a posta se você tiver solucionado o problema, independente da forma que tenha conseguido corrigir!!!

Precisamos do feedback tb !!! ^_^

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá EstileingeAtomico, muito obrigado pelas explicações e pelo seu interesse em me ajudar a resolver o problema. Sou novato em programação e alguns conceitos ainda estão confusos para mim, por isso esses erros básicos.

Mas graças a seu alerta o programa está funcionando certinho agora. Inverti a declaração do vetor que estava, apost[1..6][1..100] para apost[1..100][1..6], coisa simples demais que não conseguia reparar.

Obrigado pela correção no código gerador de números aleatórios.

Sobre:

Outra coisa que eu acho que pode da erro é na String "aposta', se não me engano ele deveria ter o tamanho da linha, ou seja, String[18].

Estive pesquisando e vi que no caso da string "aposta" ela estando declarada como string pode receber até o tamanho de 255 caracteres.

Grato a todos pela atenção e ajuda.

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

×