3.4.12

Dica: Entrada e saida em C++ via bash : cin e cout

As vezes é preciso passar uma quantidade considerável de entradas para um  programa e as vezes é moroso passar por funções internas de leitura e escrita de arquivos. Em C++ por exemplo, tem-se a biblioteca <fstream> para lidar com leitura de streams de arquivos.



Para facilitar a escrita e leitura, o bash pode simplesmente passar e receber saidas através das funções cin e cout. Por exemplo, supondo alguns for's que possuem a seguinte estrutura de entrada e saida:

     cin >> instancias;
     
     for(int i = 0; i < instancias; i++){
        cin >> n_reunioes;
        
        for(int j = 0; j < n_reunioes; j++){
            cin >> start_t >> stop_t;
            reuniao r (start_t, stop_t, j+1);
            reunioes.push_back(r);
        }
        
        dias.push_back(reunioes_para_ir(reunioes));
        reunioes.clear();
    }

    for ( int i = 0; i < instancias; i++ ) {
        for ( int j = 0; j < dias[i].size(); j++ ) {
            cout << dias[i][j] ;
            
            if ( j != dias[i].size() - 1 )
                cout<< " " ;
        }
        cout << endl;
    }

Supondo um arquivo entrada.in, posso organizar minha entrada nele da seguinte forma:
103
3
08:15 08:45
08:00 08:30
08:30 09:00
5
11:00 12:00
12:20 13:15
10:10 12:15
12:30 13:00
10:30 12:16


e passa-lo com esses valores como argumento para a entrada e indicar um outro arquivo para a saída :
$./programa < entrada.in > saida.out
Com isso, o bash cuida de passar os valores no arquivo de entrada para cada pedido do cin e escrever a saida para o cout sem muito estresse. :)

Esta dica foi baseada neste post. La tem mais dicas, como por exemplo, utilizar o pipe ( | ) para passar entrada, já que o pipe é bem mais robusto que '<' ou '>'.

Nenhum comentário:

Postar um comentário