EOF obtido através de redirecionamento

EOF obtido através de redirecionamento

por Leonardo Pereira Macedo -
Número de respostas: 8

Olá,

O enunciado do EP diz que devemos ler os Pokémons e o ataque desejado, durante a batalha, pela entrada padrão.

Para facilitar a execução do programa, redirecionei a entrada para arquivos contendo as informações sobre os Pokémons, mas ocorre um EOFError quando o primeiro input de ataque é pedido por conta da entrada ter ficado vazia.

Há algum modo de retornar a entrada padrão para o teclado após terminar de ler os arquivos? Ou devo pressupor que redirecionamento não deve ser usado?

A única solução que pensei foi passar os arquivos contendo os dados dos Pokémons por linha de comando, mas isso iria contra o que é pedido no enunciado.

Em resposta à Leonardo Pereira Macedo

Re: EOF obtido através de redirecionamento

por André Meneghelli -

Bom, eu fiz algo diferente.

Coloquei um diretório chamado billpc/ que contém todos os arquivos que fiz e quando a batalha começa mostra uma lista com todos os arquivos já carregados na forma:

N - [HP] Nome

Onde N é o número pra escolha, exemplo:

Temos os seguintes pokemons disponíveis:
1 - [8001] Chuck Norris
2 - [9] Rattata
3 - [5] Metapod2
4 - [5] Metapod
5 - [60] Charizard

Pode isso, Alfredo?

Em resposta à André Meneghelli

Re: EOF obtido através de redirecionamento

por Rafael Reggiani Manzo -

Oi André,

Mais uma vez legal a solução, mas de novo foge do nosso padrão. Note que na fase final é possível que você receba um pokémon que não esteja no seu billpc e isso tornaria impossível do seu programa batalhar.

O que acha de no seu menu que lista todos os conhecidos adicionar uma opção "Outros" que permite fazer a entrada como descrita no enunciado?

Em resposta à Rafael Reggiani Manzo

Re: EOF obtido através de redirecionamento

por André Meneghelli -

Posso modificar para trabalhar com arquivos, mas como ao menos dois arquivos são necessários usar um "< blastoise" não resolveria o problema. Assim como não gostaria de ficar digitando o caminho completo ao arquivo todas as vezes que fosse testar.

Então posso colocar pra ele carregar também dois arquivos passados por linha de comando e juntar no meu billpc?

Em resposta à André Meneghelli

Re: EOF obtido através de redirecionamento

por Rafael Reggiani Manzo -

O que te sugeri foi colocar uma opção do menu que siga o enunciado: (a entrada) "se  
dará   de   forma   linear   pela   entrada   padrão,   seguindo   a   ordem   dos   atributos (...)". Então seria um único arquivo com os dois pokémons para fazer o redirecionamento de entrada como você mencionou.

Eu entendo que isso pode ser chato, mas infelizmente se cada um implementar as mecânicas como quiser ignorando o enunciado, além de ficar impossível de corrigir os trabalho de uma turma com mais de 50 alunos, fica impossível realizar batalhas entre os programas já que cada um vai estar em uma regra diferente.

Então considere a sugestão, uma forte sugestão sorriso

 

Em resposta à Leonardo Pereira Macedo

Re: EOF obtido através de redirecionamento

por Rafael Reggiani Manzo -

Oi Leonardo,

O que acha de não redirecionar a entrada pelo Python e deixá-la sempre pelo teclado? Dessa forma, você ainda pode carregar os arquivos facilmente redirecionando eles pelo bash (http://www.gnu.org/software/bash/manual/bashref.html#Redirections) e ter a liberdade de usar o teclado caso queira.

Em resposta à Rafael Reggiani Manzo

Re: EOF obtido através de redirecionamento

por Leonardo Pereira Macedo -

Oi Rafael,

Obrigado pela dica. Até agora eu estava fazendo o seguinte para ler os arquivos:

cat pokemon1.txt pokemon2.txt | ./main.py

Para contornar o EOF que mencionei, a solução que meu grupo encontrou foi adicionar um '-' no final do cat, para que o stdin volte a ser o teclado:

cat pokemon1.txt pokemon2.txt - | ./main.py

Em resposta à Leonardo Pereira Macedo

Re: EOF obtido através de redirecionamento

por Eric Lee -

Eu estou com o mesmo problema, mas pra mim isso n resolve pois o stdin.readlines() espera por um EOF para prosseguir com o programam as se eu mando o EOF no input() gera o erro.


Também não entendi direito como usar o bash no redirecionamento...

Alguem pode me ajudar?