Dúvida em C - Redirecionar entrada padrão

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?

Boa tarde,

[code]
/* 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;
}[/code]
http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

Eh isso?

[]'s

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

Posta o código, por favor!

[]'s

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

[quote=getAdicted]Posta o código, por favor!

[]'s[/quote]

executando o programa pelo prompt
programa.exe < arquivo.txt

[code]
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;

}[/code]

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

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;  
    }  

[quote=entanglement] programa.exe arquivo.txt

[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”

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

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:

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