Ir ao conteúdo
  • Cadastre-se

C++ ERROR cannot convert 'char*' t


The_Ruivo

Posts recomendados

#include <iostream>
#include<stdio.h>
#include<locale.h>

using namespace std;

typedef struct
{
	char nome[120];
	char empresa[120];
	char email[300];
	char endereco[120];
	int celular,fixo;
	
}Cliente;

int main(int argc, char** argv) {
	
	setlocale(LC_ALL, "Portuguese");
	
	FILE *Dados_Cliente;
	
	Cliente Cliente;
	
	char arquivo[120];
	
	printf("Digite o nome do arquivo a ser criado: ");
	scanf("%s",&arquivo);
	
	Dados_Cliente = fopen(arquivo,"wt");
	
	if(Dados_Cliente==NULL)
	{
		printf("Não foi possível abrir o arquivo");
		return(0);
	}
	
	printf("Digite o nome do cliente: ");
	scanf("%c",&Cliente.nome);
	fprintf(arquivo,"Nome do cliente: ",Cliente.nome);
	
	fclose(Dados_Cliente);
	
	return 0;
}

Estou tentando fazer um programa em C++ para que a pessoa possa colocar todos os dados do cliente dela e ele seja impresso em um arquivo ".txt" só que eu estou tendo um problema na linha 40, onde o compilador dá a seguinte mensagem: "[Error] cannot convert 'char*' t". Não sei como resolver isso, e já até procurei em alguns fóruns, mas nenhum me deu uma solução concreta.

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

@The_Ruivo    creio que ele esteja dizendo que o tipo de dados do arquivo não foi determinado ,  e esse código é todo da linguagem  c  ,  e você postou no tópico de c++ ,  mas a linguagem c++ aceita todos os comando da linguagem c , e então seu código com algumas modificações poderia ser assim  :

 

#include <iostream>
#include <stdio.h>
#include <locale.h>
using namespace std;
typedef struct{
	char nome[120];
	char empresa[120];
	char email[300];
	char endereco[120];
	int celular,fixo;
}Cliente;
int main(int argc, char** argv) {
	setlocale(LC_ALL, "Portuguese");
	FILE *Dados_Cliente;
	Cliente Cliente;
	char arquivo[120];
	printf("Digite o nome do arquivo a ser criado: ");
	scanf("%s",arquivo);                  /* não precisa do & pois string já é um endereço de memória          */
	strcat(arquivo,".txt");               /* concatenar o tipo do arquivo                                      */
	Dados_Cliente = fopen(arquivo,"w");   /* w cria o arquivo e reseta ela para gravar a partir do começo dele */
	if(Dados_Cliente==NULL){
		printf("Não foi possível abrir o arquivo");
		return(0);
	}
	printf("Digite o nome do cliente : ");
	scanf("%s",Cliente.nome);             /* nome é string com s e não precisa do &                            */
	fprintf(Dados_Cliente/*arquivo*/,"%s" /*Nome do cliente: "*/,Cliente.nome);
              /* 1º o arquivo ,      2º o tipo de dado,           3º o dado                                    */
	fclose(Dados_Cliente);
    return 0;
}

 

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

3 horas atrás, devair1010 disse:

creio que ele esteja dizendo que o tipo de dados do arquivo não foi determinado ,  e esse código é todo da linguagem  c  ,  e você postou no tópico de c++ ,  mas a linguagem c++ aceita todos os comando da linguagem c , e então seu código com algumas modificações poderia ser assim

Muitas vezes as pessoas confundem em qual linguagem elas estão programando, Se é C ou C++.

Declarar que C e C++ é a mesma linguagem de programação e quase que dar um tiro no próprio pé, porque o C está na versão 18 e o C++ está na versão 14 (Resumindo as duas se tornaram incompatíveis há alguns anos).

 

então eu recomendo para vocês focarem em só uma linguagem é esquecer por hora a outra.

incompatibilities between c and cpp

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

3 horas atrás, devair1010 disse:

no dev c++ 4.9.9.2 ele aceita todos os comando da linguagem c .

Não sei em qual linguagem você programa se é C ou C++, mas quando você usa C direto de um compilador de C++.

Você na realidade está usando um subconjunto de C++ (só a parte procedural) para programar em C++, no final das contas você acaba ficando sem usar o potencial das duas linguagens de programação.

 

Não estou falando isso é errado.

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

28 minutos atrás, devair1010 disse:

no dev c++ 4.9.9.2 ele aceita todos os comando da linguagem c .

 

Aceitar ate aceita mas pode ter muitos problemas de incompatibilidade referente a escrita e verificação de tipos principalmente em versões de C++ apos a padronização da linguagem. Agora se você usa um compilador muito antigo realmente não deve ter muitos problemas em escrever código C.

 

Acredito que a principal versão de C usada aqui no BR ainda seja a  versão 89 e usar código portado dessa versão pra versões mais modernas do C++ realmente vai ser um tiro no pe, vai ter muita coisa que você consegue fazer sem problemas no C que não vai funcionar sem algum tipo de adequação no C++.

 

Nem sempre C é um subconjunto de C++ hehe

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

@devair1010 agora estou tendo o seguinte erro:warning: format ‘%f’ expects argument of type ‘float*’, but argument 2 has type ‘double’ [-Wformat=]

Segue o código:

#include <iostream>
#include <stdio.h>
#include <locale.h>
#include<string.h>
using namespace std;
typedef struct{
	char nome[120];
	char empresa[120];
	char email[300];
	char endereco[120];
	float celular,fixo;
}Cliente;
int main(int argc, char** argv) {
	setlocale(LC_ALL, "Portuguese");
	FILE *Dados_Cliente;
	Cliente Cliente;
	char arquivo[120];

	printf("Digite o nome do arquivo a ser criado(não utilize espaço, se necessário, use underline): ");
	scanf("%s",arquivo);                  /* não precisa do & pois string já é um endereço de memória          */
	strcat(arquivo,".txt");               /* concatenar o tipo do arquivo                                      */
	Dados_Cliente = fopen(arquivo,"w");   /* w cria o arquivo e reseta ela para gravar a partir do começo dele */

	if(Dados_Cliente==NULL){
		printf("Não foi possível abrir o arquivo");
		return(0);
	}
	
	printf("Digite o nome do cliente : ");
	scanf("%s",Cliente.nome);            
	fprintf(Dados_Cliente,"Cliente: %s\n" ,Cliente.nome);
	
	printf("Digite o nome da empresa do cliente: ");
	scanf("%s",Cliente.empresa);
	fprintf(Dados_Cliente,"Empresa: %s\n",Cliente.empresa);
	
	printf("Digite o e-mail de contato do cliente: ");
	scanf("%s",Cliente.email);
	fprintf(Dados_Cliente,"E-mail: %s\n",Cliente.email);
	
	printf("Digite o celular do cliente: ");
	scanf("%f",Cliente.celular);
	fprintf(Dados_Cliente,"Celular: %f\n",Cliente.celular);
	
	printf("Digite o telefone fixo do cliente: ");
	scanf("%f",Cliente.fixo);
	fprintf(Dados_Cliente,"Fixo: %f\n",Cliente.fixo);
	
	printf("Digite o endereço do cliente: ");
	scanf("%s",Cliente.endereco);
	fprintf(Dados_Cliente,"Endereço: %s\n",Cliente.endereco);
	
	fclose(Dados_Cliente);
	
	system("pause");
    return 0;
}

 

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

@The_Ruivo Toda vez que você for pegar algum valor com scanf() você precisa passar um endereço para a função (mais conhecido como ponteiro). Quando nós passamos strings (uma string é um vetor de caracteres) para scanf(), nós não precisamos passar o endereço, porque uma string já é um ponteiro.

 

Então você teria que usar o operador de referencia &(não confundir com o AND bit a bit) dessa maneira

	scanf("%f",&Cliente.celular);

 

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

22 horas atrás, The_Ruivo disse:

Não sei como resolver isso, e já até procurei em alguns fóruns, mas nenhum me deu uma solução concreta.

 

Não entendi quase nada da discussão, mas o que posso dizer é que C e C++ são linguagens muito distintas. C++ é uma linguagem enorme e com muitas facilidades. C é uma linguagem bem compacta e gera programas compactos e muito, muito rápidos. E é trivial mixar código compilado escrito em C e C++ e assim se economiza tempo e dinheiro hoje em dia.

 

A Solucão Concreta

Você declarou 

char arquivo[120];

E assim arquivo é do tipo char*

Por outro lado você escreveu na tal linha 40

    fprintf(arquivo,"Nome do cliente: ",Cliente.nome);

E printf() é declarada 

int printf(FILE* stream, const char* format, ...);

E o compilador não sabe como converter char* para FILE*

 

E você declarou 

    FILE *Dados_Cliente;

E deveria ter escrito 

    fprintf(Dados_Cliente, "Nome do cliente: ",Cliente.nome);

 

Reclamação concreta:

como a listagem do programa não tem números de linha, você bem que poderia ter dito qual a linha 40 ;) e eu teria economizado uns 90s

adicionado 12 minutos depois
	printf("Digite o celular do cliente: ");
	scanf("%f",Cliente.celular);
	fprintf(Dados_Cliente,"Celular: %f\n",Cliente.celular);
	
	printf("Digite o telefone fixo do cliente: ");
	scanf("%f",Cliente.fixo);
	fprintf(Dados_Cliente,"Fixo: %f\n",Cliente.fixo);
	

E aqui sua estrutura Cliente é estática então deve usar ponto para acessar os campos e & para referenciar os endere;cos que scanf() espera...

 

Apenas use &Cliente.celular e &Cliente.fixo

 

float para esse tipo de dados é estranho hein? o normal é algo da forma +ccc (aaa) nnnn-nnnn-nnnn e por isso se usa em geral uma string ou mesmo uma classe com os campos de código de país, código de área e número separados, no formato de string. E se aceita separadores porque cada um tem um costume, e letras no "número", porque muita gente memoriza ou anota os números por letra  em muitos países. Aqui só me lembro do 333 PORTO da seguradora.

 

E isso é oficial: E.161 : Arrangement of digits, letters and symbols on telephones and other devices that can be used for gaining access to a telephone network

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

1 hora atrás, arfneto disse:

printf("Digite o celular do cliente: "); scanf("%f",Cliente.celular); fprintf(Dados_Cliente,"Celular: %f\n",Cliente.celular); printf("Digite o telefone fixo do cliente: "); scanf("%f",Cliente.fixo); fprintf(Dados_Cliente,"Fixo: %f\n",Cliente.fixo);

Quando eu uso assim, o compilador fecha o programa depois que eu coloco qualquer número e não aparece nenhum erro nem nada.

 

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

@The_Ruivo      é como o @KXSY   disse precisa colocar o  &  no scanf , só no scanf com string que não precisa ,  e seu código poderia ser assim  :

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>
using namespace std;
typedef struct{
	char nome[120];
	char empresa[120];
	char email[300];
	char endereco[120];
	float celular,fixo;
}Cliente;
int main(int argc, char** argv) {
	setlocale(LC_ALL, "Portuguese");
	FILE *Dados_Cliente;
	Cliente Cliente;
	char arquivo[120];

	printf("( n%co utilize espa%co, se necess%crio , use underline )\n",
             198,135,160);
	printf("Digite o nome do arquivo a ser criado : ");
	scanf("%s",arquivo);                  /* não precisa do & pois string já é um endereço de memória          */
	strcat(arquivo,".txt");               /* concatenar o tipo do arquivo                                      */
	Dados_Cliente = fopen(arquivo,"a+");  /* tenta abrir o arquivo para leitura ou gravação no final dele      */
	if(Dados_Cliente==NULL)               /* se o arquivo não existir                                          */
	Dados_Cliente = fopen(arquivo,"w");   /* w cria o arquivo e reseta ele para gravar a partir do começo dele */

	printf("%s\n",arquivo);
	if(Dados_Cliente==NULL){
		printf("Não foi possível abrir o arquivo");
		return(0);
	}

	printf("Digite o nome do cliente : ");
	scanf("%s",Cliente.nome);
	fprintf(Dados_Cliente,"Cliente: %s\n" ,Cliente.nome);

	printf("Digite o nome da empresa do cliente: ");
	scanf("%s",Cliente.empresa);
	fprintf(Dados_Cliente,"Empresa: %s\n",Cliente.empresa);

	printf("Digite o e-mail de contato do cliente: ");
	scanf("%s",Cliente.email);
	fprintf(Dados_Cliente,"E-mail: %s\n",Cliente.email);

	printf("Digite o celular do cliente: ");
	scanf("%f",&Cliente.celular);/* faltou o & pois aqui é float e nã string */
	printf("%s\n",Cliente.celular);
	fprintf(Dados_Cliente,"Celular: %f\n",Cliente.celular);

	printf("Digite o telefone fixo do cliente: ");
	scanf("%f",&Cliente.fixo);/* faltou o & pois aqui é float e nã string */
	fprintf(Dados_Cliente,"Fixo: %f\n",Cliente.fixo);

	printf("Digite o endereço do cliente: ");
	scanf("%s",Cliente.endereco);
	printf("para testar -> %s\n",Cliente.endereco);
	fprintf(Dados_Cliente,"Endereço: %s\n",Cliente.endereco);

	fclose(Dados_Cliente);

	system("pause");
    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

@devair1010 Ele continuou dando erro na hora de colocar o número do cliente, o programa simplesmente fecha e dá como concluído. Não entendi por que isso está acontecendo, você acha que se eu trocar o tipo da variável pode resolver?

Tipo, ao invés de float, colocar int ou double?

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

2 minutos atrás, The_Ruivo disse:

@devair1010 Ele continuou dando erro na hora de colocar o número do cliente, o programa simplesmente fecha e dá como concluído. Não entendi por que isso está acontecendo, você acha que se eu trocar o tipo da variável pode resolver?

Tipo, ao invés de float, colocar int ou double?

Agora eu consegui resolver e o programa está funcionando perfeitamente, obrigado a todos que me ajudaram, se alguém quiser o código pronto, vou deixar ele aqui:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>
using namespace std;
typedef struct{
	char nome[120];
	char empresa[120];
	char email[300];
	char endereco[120];
	int celular,fixo;
}Cliente;
int main(int argc, char** argv) {
	setlocale(LC_ALL, "Portuguese");
	FILE *Dados_Cliente;
	Cliente Cliente;
	char arquivo[120];

	printf("( n%co utilize espa%co, se necess%crio , use underline )\n",
             198,135,160);
	printf("Digite o nome do arquivo a ser criado : ");
	scanf("%s",arquivo);                  /* não precisa do & pois string já é um endereço de memória          */
	strcat(arquivo,".txt");               /* concatenar o tipo do arquivo                                      */
	Dados_Cliente = fopen(arquivo,"a+");  /* tenta abrir o arquivo para leitura ou gravação no final dele      */
	if(Dados_Cliente==NULL)               /* se o arquivo não existir                                          */
	Dados_Cliente = fopen(arquivo,"w");   /* w cria o arquivo e reseta ele para gravar a partir do começo dele */

	printf("%s\n",arquivo);
	if(Dados_Cliente==NULL){
		printf("Não foi possível abrir o arquivo");
		return(0);
	}

	printf("Digite o nome do cliente : ");
	scanf("%s",Cliente.nome);
	fprintf(Dados_Cliente,"Cliente: %s\n" ,Cliente.nome);

	printf("Digite o nome da empresa do cliente: ");
	scanf("%s",Cliente.empresa);
	fprintf(Dados_Cliente,"Empresa: %s\n",Cliente.empresa);

	printf("Digite o e-mail de contato do cliente: ");
	scanf("%s",Cliente.email);
	fprintf(Dados_Cliente,"E-mail: %s\n",Cliente.email);

	printf("Digite o celular do cliente: ");
	scanf("%i",&Cliente.celular);/* faltou o & pois aqui é float e não string */
	fprintf(Dados_Cliente,"Celular: %i\n",Cliente.celular);

	printf("Digite o telefone fixo do cliente: ");
	scanf("%i",&Cliente.fixo);/* faltou o & pois aqui é float e não string */
	fprintf(Dados_Cliente,"Fixo: %i\n",Cliente.fixo);

	printf("Digite o endereço do cliente: ");
	scanf("%s",Cliente.endereco);
	fprintf(Dados_Cliente,"Endereço: %s\n",Cliente.endereco);

	fclose(Dados_Cliente);

	system("pause");
    return 0;
}

 

adicionado 3 minutos depois

@arfneto O programa que estou fazendo é para o meu pai, só para ele ter um controle dos clientes mesmo, não precisa seguir nenhuma regra nem nada, por isso vou deixar assim mesmo. Mas obrigado pela informação, não sabia disso, e se algum dia precisar disso já vou estar informado e farei de maneira mais eficiente.

Obrigado pela ajuda ;)

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

Não seria melhor usar o ofstream do C++ ? Algo assim...

 

#include <iostream>
#include <locale.h>
#include <fstream>

using namespace std;

struct Clientes{
	char nome[120];
	char empresa[120];
	char email[300];
	char endereco[120];
	int celular,fixo;
};

int main(int argc, char** argv)
{
	setlocale(LC_ALL, "Portuguese");

	ofstream arquivo;
	arquivo.open("clientes.txt", ios::out | ios::app);
	Clientes Cliente;

	cout << "Digite o nome do cliente : ";
	cin.getline(Cliente.nome,120);
	arquivo << "Cliente: " << Cliente.nome << endl;

	cout << "Digite o nome da empresa do cliente: ";
	cin.getline(Cliente.empresa,120);
	arquivo << "Empresa: " << Cliente.empresa << endl;

	cout << "Digite o e-mail de contato do cliente: ";
	cin.getline(Cliente.email,300);
	arquivo << "E-mail: " << Cliente.email << endl;

	cout << "Digite o celular do cliente: ";
	cin >> Cliente.celular;
	cin.ignore();
	arquivo << "Celular: " << Cliente.celular << endl;

	cout << "Digite o telefone fixo do cliente: ";
	cin >> Cliente.fixo;
	cin.ignore();
	arquivo << "Fixo: " << Cliente.fixo << endl;

	cout << "Digite o endereço do cliente: ";
	cin.getline(Cliente.endereco, 120);
	arquivo << "Endereço: " << Cliente.endereco << endl;

	arquivo.close();

	system("pause");
    return 0;
}

 

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

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...