sábado, 18 de dezembro de 2021

Qt - utilizando streams em C++

Quando precisamos fazer leitura num arquivo de disco 
para extração de dados, a classe ifstream dá suporte
perfeito para isto, tudo o que temos que fazer,
é construir um objeto da classe ifstream e especificar
dados binários ou em modo de texto.
A classe ifstream está entre as três classes
de fluxo de entrada mais importantes do C++,
seguidas pelas classes: istream e istringstream.
Se precisarmos converter números ou qualquer tipo 
com os operadores de fluxos << >> sobrecarregados,
a poderosa biblioteca sstream (fluxos) nos permite
realizar estas operações facilmente com entrada e
saída formatadas, só precisamos incluir o cabeçalho 
#include <sstream> e declarar um objeto da classe stringstream.
Penso comigo mesmo que em C++ esta é a maneira mais fácil de converter
um número em string e ainda imagino que seja o caminho mais curto,
pois em apenas duas etapas se consegue isto facilmente,
o número é enviado para o fluxo e a string e retirada do stream.
Para saber mais, veja entradas e saídas em C++, 
onde streams são devidamente esclarecidos com detalhes.
Neste programa foi isto que fizemos, lemos um arquivo de texto
do disco com ifstream, este arquivo foi criado previamente 
com os dez mil primeiros números naturais ordenados e
copiamos numa string padrão do C++,
em seguida, declaramos um objeto da classe stringstream,
que foi carregada com a variável string padrão.
Agora o que mais me impressionou foi a capacidade
e facilidade destas conversões num array de inteiro
de estilo C de dez mil inteiros, porque até então,
só tínhamos feitos conversões simples, e não esperava
um desempenho tão preciso para as matrizes de inteiros do C.
Como já faz muito tempo que não utilizo o Qt, 
resolvi apresentar estas saídas numa janela gráfica,
e em nada se comportou inferior ao C++ Builder,
e nem ainda ao C++ CLI do Visual Studio.



//====================================================================
void MainWindow :: Pesq_String ( ) {
    ui -> lineEdit -> setFocus ( );
    QString str;
    int a = -1;

    string numeral;
    std::ifstream arq ( "Dez_Mil.txt" );

    if ( arq.is_open ( ) ) {
        while ( !arq.eof ( ) ) {
            getline ( arq, numeral );
        }
        arq.close ( );
    }

    stringstream stream ( numeral );

    while ( stream ) {
        a++;
        stream >> A [ a ];

        str += "    ";
       if ( a % 10 == 0 )
           str += "<p>";

        if ( a >= 0 && a < 10 )
           str += ( "000" );

       if ( a >= 10 && a < 100 )
           str += ( "00" );

       if ( a >= 100 && a < 1000 )
           str += ( "0" );


       str += QString::number (  A [ a ] );
    }
    ui -> textEdit -> setText (  str  );
    ui -> lineEdit -> setFocus ( );
   }
//============================================================