Dúvida em C - Redirecionar entrada padrão

11 respostas
H

Seguinte galera,

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.

Alguém poderia ajudar?

11 Respostas

G

Boa tarde,

/* scanf example */
#include <stdio.h>

int main ()
{
  char str [80];
  int i;

  printf ("Enter your family name: ");
  scanf ("%s",str);  
  printf ("Enter your age: ");
  scanf ("%d",&i);
  printf ("Mr. %s , %d years old.\n",str,i);
  printf ("Enter a hexadecimal number: ");
  scanf ("%x",&i);
  printf ("You have entered %#x (%d).\n",i,i);
  
  return 0;
}
http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

Eh isso?

[]'s

H

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

G

Posta o código, por favor!

[]'s

E

freopen -
Windows: http://msdn.microsoft.com/en-us/library/wk2h68td(v=vs.80).aspx
Linux: http://linux.die.net/man/3/freopen

H
getAdicted:
Posta o código, por favor!

[]'s

executando o programa pelo prompt programa.exe < arquivo.txt
int main(){
    int cont=0, number;
    int vet[MAX];
    char str[20];

    while (scanf("%d", &vet[cont]) == 1){
        cont++;
    }
    
    scanf("%s %d", str, &number);

    return 0;
}

eh isso ai, ele vai ler todos os dados do .txt que no caso eh igual esse aqui (http://pastebin.com/FG7hiDd3)

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

E
programa.exe  arquivo.txt
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;  
    }
H
entanglement:
programa.exe  arquivo.txt
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;  
    }

deu certo, porem não há outro modo redirecionando a entrada padrão? "programa.exe < arquivo.txt"

D

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

E

Até dá para “re-redirecionar”; você usa freopen, como eu indiquei.
Como é que você faz isso deixo para vossa excelência quebrar a cabeça :slight_smile:

D

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

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++).

D

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

//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.

Criado 12 de junho de 2012
Ultima resposta 9 de jul. de 2012
Respostas 11
Participantes 5