whoami-r Posted June 2, 2018 at 05:04 PM Report #610835 Posted June 2, 2018 at 05:04 PM Boas pessoal, estou a tentar criar uma função que guarde os dados de um cliente (neste momento apenas o nome), mas sempre que executo o programa os dados ficam guardados em binário. se me poderem ajudar a descobrir onde estou a errar... deixo a função que fiz em baixo void registar_cliente() { FILE *arq_clientes = fopen("clientes.txt", "w"); if (arq_clientes == NULL) { printf("\nErro ao abrir o ficheiro!\n"); exit(1); // aborta o programa } int cont_bytes = 0; //o ID do cliente deve ser gerado automaticamente // cont irá guardar o número total de bytes fseek(arq_clientes, 0, SEEK_END); // o ponteiro aponta para o final do ficheiro cont_bytes = ftell(arq_clientes); // ftell devolve a posiçao atual em bytes t_cliente cliente; if(cont_bytes == 0) { cliente.id = 1; } else { t_cliente ultimo_cliente; fseek(arq_clientes, cont_bytes - sizeof (t_cliente), SEEK_SET); //cont_bytes - sizeof(t_cliente) serve para posicionar // para que possamos chegar ao último cliente registado fread(&ultimo_cliente, sizeof (t_cliente), 1, arq_clientes); cliente.id = ultimo_cliente.id + 1; // o ID do cliente é o ID do último cliente acrescido em 1 } printf("\nDigite o nome do cliente: "); scanf("%99[^\n]%*c", cliente.nome); // ^\n indica para pegar até a quebra de linha (enter) fflush(stdin); fseek(arq_clientes, 0, SEEK_END); fwrite(&cliente, sizeof (t_cliente), 1, arq_clientes); // escreve no arquivo fclose(arq_clientes); printf("\nCliente \"%s\" cadastrado com sucesso!\n", cliente.nome); printf("\nPressione <Enter> para continuar..."); scanf("%*c"); fflush(stdin); }
HappyHippyHippo Posted June 2, 2018 at 05:54 PM Report #610836 Posted June 2, 2018 at 05:54 PM as funções fread e fwrite são para escrita e leitura em binário, logo o que está a acontecer é o esperado o que deverias fazer seria usar as funções fprint e fscan 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
whoami-r Posted June 3, 2018 at 01:14 PM Author Report #610837 Posted June 3, 2018 at 01:14 PM 19 horas atrás, HappyHippyHippo disse: as funções fread e fwrite são para escrita e leitura em binário, logo o que está a acontecer é o esperado o que deverias fazer seria usar as funções fprint e fscan pois, estava a usae as funçoes mal outra duvida, p.ex eu quero introduzir o nif na consola e depois quero que fique também guardado no ficheiro de texto, mas com o que tenho aparece outro número (provavelmente da memoria) diferente daquele que introduzi ... t_cliente cliente; printf("\nDigite o nome do cliente: "); scanf(" %99[^\n]%*c", cliente.nome); // ^\n indica para pegar até a quebra de linha (enter) printf("\nDigite o NIF do cliente: "); scanf(" %99[^\n]%*c", cliente.nif); fflush(stdin); fseek(arq_clientes, 0, SEEK_END); fflush(stdin); fprintf(arq_clientes, "NIF: %i\tNOME: %s\tID: %d\n", cliente.nif, cliente.nome, cliente.id); // escreve no arquivo fclose(arq_clientes); printf("\nCliente \"%s\" registado com sucesso!\n", cliente.nome); printf("\nPressione <Enter> para continuar..."); scanf("%*c"); fflush(stdin);
HappyHippyHippo Posted June 3, 2018 at 01:42 PM Report #610838 Posted June 3, 2018 at 01:42 PM qual a estrutura do tipo de dados t_cliente ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
whoami-r Posted June 3, 2018 at 01:44 PM Author Report #610839 Posted June 3, 2018 at 01:44 PM 1 minuto atrás, HappyHippyHippo disse: qual a estrutura do tipo de dados t_cliente ? typedef struct cliente { int id; int nif; char nome[MAX]; //MAX = 100 } t_cliente;
HappyHippyHippo Posted June 3, 2018 at 01:45 PM Report #610840 Posted June 3, 2018 at 01:45 PM nesse caso, se nif é um inteiro, então a forma como estás a ler-lo através do scanf está errada, pois estás a ler uma string e não um inteiro IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
whoami-r Posted June 3, 2018 at 01:48 PM Author Report #610841 Posted June 3, 2018 at 01:48 PM 2 minutos atrás, HappyHippyHippo disse: nesse caso, se nif é um inteiro, então a forma como estás a ler-lo através do scanf está errada, pois estás a ler uma string e não um inteiro neste linha? scanf(" %99[^\n]%*c", cliente.nif);
HappyHippyHippo Posted June 3, 2018 at 02:16 PM Report #610842 Posted June 3, 2018 at 02:16 PM Sim IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
whoami-r Posted June 3, 2018 at 02:25 PM Author Report #610843 Posted June 3, 2018 at 02:25 PM 9 minutos atrás, HappyHippyHippo disse: Sim ok obrigado
whoami-r Posted June 3, 2018 at 03:31 PM Author Report #610844 Posted June 3, 2018 at 03:31 PM 1 hora atrás, riqu3s disse: ok obrigado tentei usar scanf(" %99[^\n]%*d", cliente.nif); mas continua a não dar...
HappyHippyHippo Posted June 3, 2018 at 03:50 PM Report #610845 Posted June 3, 2018 at 03:50 PM " %d\n" IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
whoami-r Posted June 3, 2018 at 03:54 PM Author Report #610846 Posted June 3, 2018 at 03:54 PM 3 minutos atrás, HappyHippyHippo disse: " %d\n" /cygdrive/C/Program Files/NetBeans 8.2/ide/bin/nativeexecution/dorun.sh: line 71: 15816 Segmentation fault sh "${SHFILE}" Press [Enter] to close the terminal ... aparece me este erro na consola...
HappyHippyHippo Posted June 3, 2018 at 06:19 PM Report #610847 Posted June 3, 2018 at 06:19 PM é impossível determinar qual o problema sem ter o código todo ou o tracestack da execução IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now