Ir para conteúdo
Fórum Script Brasil
  • 0

Problema cin.getline


Mauro Thiago

Pergunta

Olá galera,

insiro meu primeiro post no fórum, agradeço desde já a todos por participar juntamente com todos.

O que acontece, montei uma classe para mysql, no qual faço conexão, possui alguns métodos por enquanto que são conectar, consultar, menu.

o que acontece é que quando seleciono a opção de consulta, ele em vez de parar na linha cin.getline para inserir uma consulta (tipo select...) ele passa direto e não dá opção de digitar. Só consigo fazer ele parar para eu digitar, quando passo parametro ";" no cin.getline (query,256,';');

quando deixo cin.getline (query,256); ele passa batido.

alguém saberia o que pode ser?

Abaixo o código que estou usando.

ARQ bancoDB.cpp

============

#include <windows.h>
#include "bancoDB.hpp"
#include <mysql/mysql.h>
#include <iostream>

using namespace std;

// parametros da conexao com o BD
BancoDB::BancoDB()
: host("localhost"),user("root"),pass(""),database("petrobras")
{};

// destrutor da classe
BancoDB::~BancoDB(){};

void BancoDB::menu() {
    cout << "Banco de Dados\n";
    cout << "==============\n\n";
    cout << "1 - Consultar\n";
    cout << "2 - Sair\n";
    cout << "Digite o numero do que deseja acessar: ";
};                        

// metodo para conectar ao banco 
void BancoDB::conectar() {
    MYSQL *sock;
    sock= mysql_init(NULL);
    sock = mysql_real_connect(sock, host.c_str(), user.c_str(), pass.c_str(), database.c_str(),0,NULL,0);
    conexao = sock;
    if (conexao) {
        printf("sock ok!\n");
    }
    else {
         printf ("Handle falhou!\n");
    }
};

//metodo para efetuar consulta no Banco
void BancoDB::consultar() {

    //variaveis usadas no programa para retornar resultados da pesquisa
    MYSQL_RES *result;
    MYSQL_ROW row;
    int i;
    int loop;

    // pega dados de input
    system("cls");
    cout << "Banco de Dados\n";
    cout << "==============\n\n";
    cout << "Digite sua QUERY: ";
    cin.getline (query,256,';');

    // executa letras maiuscula para minuscula 
    for (loop = 0; query[loop] !=0; loop++)
    query[loop] = toupper(query[loop]);

    // condicao para consulta
    if(mysql_query(conexao,query)) {
        printf("===Foi encontrado um erro na query===");
        cout << "\n";
        cout << "ERRO: ===============================\n";
        cout << mysql_error(conexao) << "\n";
        cout << "=====================================";
    }
    else {
        result = mysql_store_result(conexao);
        if (result) {
            while ((row = mysql_fetch_row(result)) != NULL) {
                for (i=0; i < mysql_num_fields(result); i++) {
                    if ((row[i] != NULL) && (row[i] != ""))
                       printf(" %s ||", row[i]);
                }
                printf("\n");
            } 
        }
    }
    cout << "\n\n";
    system("pause");
};

int main() {

    // variavel para interacao no sistema
    int operador = 1;
    
    // variavel para guardar a query de consulta
    char sql[80];

    // criar objeto de conexao
    BancoDB minhaconexao;
    
    // executa conexao com o Banco
    minhaconexao.conectar();

    // operador = 0, encerra o programa
    while (operador!=0) {

        // limpa tela
        system("cls");
          
        //executa menu
        minhaconexao.menu();

        //captura numero selecionado
        cin >>(operador);

        // verifica qual opcao do menu deseja selecionar
        switch ( operador ){
     
            // ===== efetua a consulta ===== //      
            // ===>
            case 1:
                minhaconexao.consultar();
                operador = 1; 
                break;
            // <===
            // ===== efetua a consulta ===== //      
        

            // ===== sair ===== //      
            // ===>
            case 2:
                return 0; 
                break;
            // <===
            // ===== sair ===== //      
    
        default:
            operador = -1;
        }
    }
    
    // executa metodo da classe BancoDB
    minhaconexao.conectar();

    // executa consulta no banco
    minhaconexao.consultar();

    // executa pausa no sistema plataforma windows
    system("pause");

    // destroi a conexao
    minhaconexao.~BancoDB();
    
    // sai do sistema   
    return 0;   
}
ARQ bancoDB.hpp ============
#include <mysql/mysql.h>
#include <iostream>

class BancoDB
{
   private:
    std::string host;
    std::string user;
    std::string pass;
    std::string database;
    MYSQL *conexao;
    char *query;

      public:  
        BancoDB();
        ~BancoDB();
        void conectar();
        void consultar();
        void menu();
   };

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Olá pessoal do fórum,

consegui solucionar o problema. Isso acontece devido ao fato de ficar lixo no buffer da máquina.

Então antes de efetuar a parada para digitar alguma informação solicitada pelo programa,

faço uma limpeza do buffer tal como:

pelo que consta funciona nas duas plataformas

getchar();

cin.getline...

Em Windows:

fflush(stdin);

Em Linux:

__purge(); (com dois underline mesmo)

;) :rolleyes:

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...