Ir ao conteúdo
  • Cadastre-se

Buscar Endereço Online / C++


Posts recomendados

Estou Fazendo um Programa que armazena informações do cliente...

 

uma das informações e o endereço. queria retorna esse endereço usando o 

site dos correios ou seja o usuário digita "CEP" e uso o site dos correios para retorna o endereço -> rua,bairro,localidade.

vi alguns tutoriais que mostra como fazer isto mas nenhum deles em c++, vi em c# php e ate em htm 

tentei passa isso pro c++ mas nao consegui 

em fim queria saber se e possivel fazer isto utilizando c++

 

se for possivel peço que me falem com faria o codigo mais ou menos...

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Não vou mentir pra você dizendo que é fácil pois não é, você precisa estudar sockets e como enviar packets e receber, assim você poderia utilizar um site que já obtêm diretamente os dados e retorna o local do CEP, como esse:

https://viacep.com.br/ws/01001000/json/ - o resultado é em json, mas com um algoritimo simples ja da para separar as informações.

 

---

Usando um parse xml - tem esse: https://viacep.com.br/ws/01001000/xml/

Lembrando que 01001000 é o CEP sem . e -

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@1freakday Entendi. Dei uma olhada aqui é não achei muito material em português sobre estes assuntos "na verdade quase nenhum", mas acho melhor adiar esta parte do programa um pouco, pois  parece se trata de um assunto mais avançado, e como comecei a programar a pouco tempo vou deixar para estudar sobre isso mais a frente...

 

mesmo assim Obrigado! por Tirar minha duvida.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Como você está fazendo e não é nenhum trabalho de escola ou coisa do gênero, eu vou deixar uma versão minha aqui para você estudar, porém, é bem simples e ao mesmo tempo complicado, para compilar é necessário usar code::blocks, ou alguma ide onde você possa colocar a linkagem: -lmingw32 -lwsock32

#include <iostream>
#include <winsock.h>
#include <string.h>
#include <stdio.h>

#define SERVER_IP "45.55.59.150"//https://viacep.com.br/

using namespace std;

/* Banco de dados do CEP */
struct BD_CEP{
	private:
	char *rua;
	char *bairro;
	char *cidade;
	char *uf;
	//...

	public:
    /* adicionar dados a uma variavel
	2 - nome_rua
	4 - bairro
	5 - cidade
	6 - uf
	id_acima, valor */
	void add_info(int, const char *);
	void show_info();

};

/* Variaveis globais */
int sockfd,client,cep;
struct sockaddr_in server;
WSADATA wsad;
BD_CEP resultado;

/* Lidar com erros */
typedef enum SOCK_ERROR
{
	INIT_WSA,
	INIT_SOCKET,
	INIT_CONNECT
}SOCK_ERROR;


/* Protótipos */
int init_socket();
int init_exec();
bool parse_result(const char *);
void error_handler(const SOCK_ERROR e);


/* inicio do 'jograma'.. :D */
int main()
{
    //Entrada de dados
	cout << "Digite o CEP(Sem simbolos!): ";
	cin >> cep;

	try
	{
		cout << endl << "Verificando..." << endl;
		//iniciar socket - e conexão com o SERVER_IP
		if(init_socket() == -1){
			//iniciar comunicação com servidor para obter dados
			if(init_exec()){
				resultado.show_info();
			}
			closesocket(sockfd);
		}

    //Erro de SOCKET
	}catch(const SOCK_ERROR e){
		error_handler(e);
	}catch(...){
		cout << "Erro desconhecido!\n" << endl;
	}
    return 0;
}

int init_socket(){
	//Iniciando wsa
	if(WSAStartup(MAKEWORD(2,2),&wsad) < 0){
		throw INIT_WSA;
	}else {
		//Criando socket
		sockfd = socket(AF_INET, SOCK_STREAM, 0);
		if(sockfd < 0){
			throw INIT_SOCKET;
		}

		//Configurando conexão
		server.sin_family = AF_INET;
		server.sin_port = htons(80);//Porta http
		server.sin_addr.s_addr = inet_addr(SERVER_IP);

		//Fazendo conexão com o server
		if(connect(sockfd,(const sockaddr*)&server, sizeof(server)) < 0){
			throw INIT_CONNECT;
		}
	}
	return -1;
}

int init_exec(){
	char buffer[512], request[256];
	//Usando um google chrome é possivel ver esse tipo de código em Ferramentas de Desenvolver / Network / em pagina(Headers)
	sprintf(request,"GET /ws/%i/piped/ HTTP/1.0\r\nHost: viacep.com.br\r\nConnection: keep-alive\r\n\r\n", cep);

	int d = 0;
	while(sockfd > 0){
		//Enviar dados ao site
		d = send(sockfd, request, strlen(request),0);
		if(d > 0){
			//Receber resposta do site
			d = recv(sockfd, buffer, 512, 0);
			if(d > 0){
				//Resposta a ser propriamente categorizada
				if(parse_result(buffer)){
					return true;
			   	}
				buffer[0] = '\0';
			}
		}
	}
	return false;
}
//1| - cep //nao é usado
//2| - rua
//3| - comp //nao é usado
//4| - bairro
//5| - cidade
//6| - uf
bool parse_result(const char *buffer){
    bool pass = false;
	char buf[128];
	int i = 1, cc = 0, c = 0;

	//Contado letra p/ letra
	for(c; c < strlen(buffer); c++){

		//Pulando Header,CEP,Complemento
		if(i == 1|| i == 3){
			for(c; c < strlen(buffer); c++){
				if(buffer[c] == '|')
				break;
			}
		}

        //É usado apenas por causa das variaveis da resposta
        //onde so usamos as letras depois de ':' que é a informação que
        //sera armazenada
        if(buffer[c] == ':'){
            c++;
            pass = true;
        }
        
        //Adicionar dados ao banco de dados
        if(buffer[c] == '|'){
            //Salvando dados
            buf[cc] = '\0';
            resultado.add_info(i, buf);
            buf[0] = '\0';
            i++;
            cc=0;
            pass = false;
            continue;
        }
        
        if(pass){
            buf[cc] = buffer[c];
            cc++;
        }
	}

	return (i > 1 ? true:false);
}


void BD_CEP::add_info(int id, const char *value){
	switch(id){
		case 2://rua
			rua = (char *)malloc(strlen(value));
			strcpy(rua,value);
			break;
		case 4://bairro
			bairro = (char *)malloc(strlen(value));
			strcpy(bairro,value);
			break;
		case 5://cidade
			cidade = (char *)malloc(strlen(value));
			strcpy(cidade,value);
			break;
		case 6://uf
			uf = (char *)malloc(strlen(value));
			strcpy(uf,value);
			break;
		default:
			break;
	}
}
void BD_CEP::show_info(){
	cout << "Segue os dados do CEP: " << cep << endl;
	cout << "Rua: " << rua << endl;
	cout << "Bairro: " << bairro << endl;
	cout << "Cidade: " << cidade << endl;
	cout << "UF: " << uf << endl << endl;
}

void error_handler(const SOCK_ERROR e){
	switch(e){
		case INIT_WSA:
			cout << "Erro ao inicializar WSA!\n";
			break;
		case INIT_SOCKET:
			cout << "Erro ao inicializar SOCKET!\n";
			break;
		case INIT_CONNECT:
			cout << "Erro ao criar conexao!\n";
			break;
		default:
			cout << "Erro ao desconhecido!\n";
			break;
	}
}

 

saida.png

  • Curtir 3
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!