Ir ao conteúdo
  • Cadastre-se

I/O erro 104


claudiojz

Posts recomendados

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.

Link para o comentário
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;

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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

Link para o comentário
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.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...