Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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






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

×