C ++: Como redirecionar de um arquivo para cin e exibir como se o usuário digitasse a entrada

0

Eu tenho um programa C ++ simples que usa cin para ler oito números, e estou executando em um shell bash. Quando eu o executo no terminal, fica assim (o usuário digita nos números de 1 a 8):

./add8
Please enter eight numbers: 1 2 3 4 5 6 7 8
The sum is: 36 

Estou tentando redirecionar um arquivo com oito números (por exemplo, "1 2 3 4 5 6 7 8" e uma nova linha) para o programa, mas a entrada não é exibida na tela:

./add8 < my_eight_numbers.txt
Please enter eight numbers: The sum is: 36

É possível redirecionar o arquivo para o programa e mostrar a entrada como se o usuário o tivesse digitado?

    
por Chris Gregg 11.09.2015 / 04:54

3 respostas

3

Isto pode lhe interessar .

Basicamente, você precisa determinar se deve ou não stdin em um terminal, ou algum tipo de redirecionamento / pipe. Para isso, você pode usar a função isatty .

int main(void){
    char buffer[N];
    int sum;

    /* Load buffer from stdin with fgets, fread, read, ... */

    if(!isatty(fileno(stdin)))
        printf("%s\n", buffer);

    /* Compute sum... */

    printf("The sum is %d.\n", sum);
}

Neste caso, quando stdin não é um tty (o que significa que a entrada não foi digitada), o programa imprime o buffer antes de calcular a soma.

No meu sistema, a função isatty é declarada em unistd.h . Você também precisará de stdio.h para obter fileno .

    
por 14.09.2015 / 14:57
2

O caminho c + + é para (desculpe, eu não programei em c ++ por um bom tempo)

  1. sobrecarregue o ifstream '> >' - operador para também enviar todos os caracteres para stdout (ostream) na leitura do arquivo e
  2. analisar os parâmetros posicionais e passá-los como matrizes então
  3. use esse ifstream sobrecarregado para ler o arquivo e calcule o resultado

espero que ajude

    
por 14.09.2015 / 15:04
0

Os terminais normais refletem o que vem de dentro. Parece que o que você quer fazer é emular esse comportamento se a entrada não for um terminal e, ao mesmo tempo, a saída for.

Você pode testar se um filedescriptor está se referindo a um terminal com isatty (3) .

De qualquer forma, fazer isso (programas interativos da CLI, usando o isatty) é muito contra o espírito do Unix. Melhor não escrever programas como esse. Os programas da Cli devem ser filtros, se puderem ser.

    
por 14.09.2015 / 15:00