preciso redirecionar a entrada padrão para o programa ler dados de um arquivo .txt. Até ai tudo bem, o problema é que depois de ler esses dados, a execução do programa NÃO deve ser encerrada pois preciso ler mais alguns dados, mas dessa vez digitados pelo usuário.
preciso executar o programa pelo prompt de comando
nomeDOprograma.exe < arquivo.txt (aqui eu redireciono a entrada padrão)
o programa entao le os dados do arquivo.txt mas encerra imediatamente, eu gostaria que ele permanecesse ativo pq eu preciso ler mais alguns dados que o usuário vai digitar
porem o programa encerra logo após a leitura dos dados, no caso eu queria que o programa ainda ficasse executando pois preciso ler uma string str e um numero number que o usuário ainda vai fornecer
[code]
int main(int argc, char *argv[]){
int cont=0, number;
int vet[MAX];
char str[20];
FILE *entrada;
entrada = fopen (argv[1], “rt”);
while (fscanf(entrada, "%d", &vet[cont]) == 1){
cont++;
}
fscanf(entrada, "%s %d", str, &number);
fclose (entrada);
/* A partir daqui, você pode usar scanf, etc. para ler do teclado :) */
return 0;
}
[/code][/quote]
deu certo, porem não há outro modo redirecionando a entrada padrão? “programa.exe < arquivo.txt”
[quote=davidbuzatto]Não tem como “reredirecionar”.
O caminho é abrir o arquivo, lê-lo e usar a entrada padrão com teclado mesmo, da forma que o entanglement disse.
[]'s[/quote]
Sim redirecionamento existe e sempre existiu, são princípios do sistema operacional (sistema de arquivos do mesmo), é assim que começa a existência de bibliotecas mais complexas para o tratamento e gerência de arquivos.
Caso utilize o unix (linux e outros variantes) use a biblioteca de sistema [color=blue]unistd.h[/color], ela tem função para as chamadas de sistema de nome [color=red]dup, close, open e pipe.[/color]
Use as paginas de manual para mais detalhes (no bash ou shell man ), você vai encontrar equivalentes para o windows mas não tão simples como as do linux, afinal o linux trabalha com descritores de arquivo.
Só afim de ajudar os descritores de arquivo padrões são:
stdin - 0 - entrada
stdout - 1 - saida
stderr -2 - saida de erro
Mesmo podendo trabalhar nesse nível seu problema poderia ser resolvido de outra forma com uso de basicamente qualquer biblioteca de tratamento de arquivos, lendo inicialmente um arquivo e ao encontrar o eof(end of file) inicia a leitura pela entrada padão inicialmente configurada pelo teclado.
Vale a curiosidade que sistemas como CGI para serviço web simplesmente redireciona a saída padrão para o daemon repassar ao que requisitou, e olha que da pra repassar qualquer coisa, seja string html ou qualquer tipo tratavel pelos fluxo(caso utilize C++).
[quote=Hyzek]acho que me expressei mal…eh o seguinte
preciso executar o programa pelo prompt de comando
nomeDOprograma.exe < arquivo.txt (aqui eu redireciono a entrada padrão)
o programa entao le os dados do arquivo.txt mas encerra imediatamente, eu gostaria que ele permanecesse ativo pq eu preciso ler mais alguns dados que o usuário vai digitar[/quote]
//de início utilize a leitura da entrada padrão normalmente, até encontrar o eof
...
//então feche o descritor de arquivo de entrada padrão
close(0);
//então coloque o teclado de volta no descritor de arquivo padrão
dup(1); //faz um tempo que não utilizo mas creio que seja assim;
//agora utilize a entrada padrão normalmente redirecionada do teclado
...
todas entradas e saidas no linux são controladas por um mesmo módulo, o dup faz uma cópia do fd passado por parametro para o primeiro que foi fechado, assim fechamos o fd de entrada atual e o redirecionamos para o controlador padrao novamente.