whoami-r Posted June 11, 2018 at 11:38 PM Report #610936 Posted June 11, 2018 at 11:38 PM Boas pessoal, no programa que estou a tentar fazer já consigo registar um cliente e escrever os dados num ficheiro de texto, mas quando tenciono listar todos os clientes ou algum específico através do NIF, dá um erro e não apresenta nada do que é suposto... se alguém me puder ajudar #include <stdio.h> #include <stdlib.h> #include <string.h> // biblioteca de funções de strings #include <ctype.h> // para usar o toupper() #include "structs.h" // ficheiro onde estão as structs typedef struct { char nome[50], sexo[30], username[30]; int idade, nif, id; } CLIENTE; void syst() { // função para parar o sistema system("pause"); system("cls"); } FILE* abrir_ficheiro(char caminho[], char modo) { // função para abrir o ficheiro de texto FILE *file; switch (toupper(modo)) { // coloca o modo em letras maiusculas case 'W': file = fopen(caminho, "w"); // w - write break; case 'R': file = fopen(caminho, "r"); // r - read break; case 'A': file = fopen(caminho, "a"); // a - append break; } if (file == NULL) { puts("Falha na abertura do ficheiro!"); exit(0); } return file; } void guardar_ficheiro(CLIENTE cliente) { // função para guardar dados no ficheiro FILE *file; file = abrir_ficheiro("clientes.txt", 'a'); // abre o ficheiro para acrescentar fprintf(file, "%s %d %s %d\n", cliente.nome, cliente.idade, cliente.sexo, cliente.nif); // escreve no ficheiro o nome, idade, sexo e nif fclose(file); printf("Registo efetuado com sucesso!\n"); syst(); } void mostrar() { // função para mostrar um cliente específico CLIENTE cliente; FILE *file; file = abrir_ficheiro("clientes.txt", 'r'); while (!feof(file)) { //enquanto não chegar ao fim do ficheiro fscanf(file, "%s %d %s %d\n", cliente.nome, cliente.idade, cliente.sexo, cliente.nif); // lê do ficheiro o nome, idade, sexo e nif printf("CLIENTE: %s\nIDADE: %d\nSEXO: %s\nNIF: %d", cliente.nome, cliente.idade, cliente.sexo, cliente.nif); } fclose(file); syst(); } void mostrar_especifico() { CLIENTE cliente; FILE *file; char username[30]; int opcao, verif_nif, cont = 0; printf("Informe o NIF do cliente: "); fflush(stdin); scanf(" %d", &verif_nif); file = abrir_ficheiro("clientes.txt", 'r'); while(!feof(file)) { fscanf(file, "%s %d %s %d\n", cliente.nome, cliente.idade, cliente.sexo, cliente.nif); if(cliente.nif == verif_nif) { printf("CLIENTE: %s\nIDADE: %d\nSEXO: %s\nNIF: %d", cliente.nome, cliente.idade, cliente.sexo, cliente.nif); cont++; } } fclose(file); if(cont == 0); printf("\nO NIF informado nao esta registado"); syst(); } int menu() { int opcao; do { puts("MENU: "); puts("1 - REGISTAR CLIENTE"); puts("2 - LISTAR TODOS OS CLIENTES"); puts("3 - LISTAR CLIENTE ESPECIFICO"); puts("0 - SAIR"); printf("OPCAO: "); scanf("%d", &opcao); if (opcao < 0 || opcao > 3) { puts("\nOPCAO INVALIDA, TENTE NOVAMENTE!"); syst(); } } while (opcao < 0 || opcao > 3); system("cls"); return opcao; } void registar(CLIENTE *cliente) { int opcao; do { printf("NOME: "); fflush(stdin); gets(cliente->nome); do { printf("SEXO: [1] - Masculino\t[2] - Feminino\n"); printf("Opcao: "); scanf("%d", &opcao); if (opcao == 1) { strcpy(cliente->sexo, "Masculino"); } else { if (opcao == 2) { strcpy(cliente->sexo, "Feminino"); } else { printf("Opcao Invalida!\n"); } } } while (opcao != 1 && opcao != 2); printf("Idade: "); scanf("%d", &cliente->idade); fflush(stdin); printf("NIF: "); scanf("%d", &cliente->nif); printf("\nConfirma todas as informacoes?\n[1] Sim\t[2] Nao\n"); printf("Opcao: "); scanf("%d", &opcao); if (opcao == 2) syst(); }while(opcao != 1); syst(); } void main() { CLIENTE cliente; while(1) { switch(menu()) { case 1: registar(&cliente); guardar_ficheiro(cliente); break; case 2: mostrar(); break; case 3: mostrar_especifico(); break; default: puts("Finalizando o programa..."); exit(0); } } }
HappyHippyHippo Posted June 12, 2018 at 01:42 AM Report #610937 Posted June 12, 2018 at 01:42 AM já que referes que dá erro, apresenta aqui todo o output de erro que te é apresentado IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
whoami-r Posted June 12, 2018 at 04:22 PM Author Report #610941 Posted June 12, 2018 at 04:22 PM CLIENTE: Ricardo IDADE: 0 ╗EXO: wH NIF: 127CLIENTE: Ferreira IDADE: 0 ╗EXO: wH NIF: 127 Process returned -1073741819 (0xC0000005) execution time : 3.265 s Press any key to continue. Isto é o que aparece na janela de comando... Sendo que o que está no ficheiro de texto é "Ricardo Ferreira Cardoso 19 Masculino 235441643"
HappyHippyHippo Posted June 12, 2018 at 07:32 PM Report #610944 Posted June 12, 2018 at 07:32 PM fscanf(file, "%s %d %s %d\n", cliente.nome, cliente.idade, cliente.sexo, cliente.nif); está a dizer para ler : - uma string, - um número, - uma string, - um número no entanto, estás a dizer que no ficheiro tens : - uma string, - uma string, - uma string, - um número, - uma string, - um número Ricardo Ferreira Cardoso 19 Masculino 235441643 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
whoami-r Posted June 12, 2018 at 07:34 PM Author Report #610945 Posted June 12, 2018 at 07:34 PM Então e imaginando que o número de nomes que o utilizador insere é indeterminado (podendo ter 2, 3 ou mais strings para cada nome), como é que faria? Obrigado
HappyHippyHippo Posted June 12, 2018 at 09:28 PM Report #610946 Posted June 12, 2018 at 09:28 PM terás de marcar no ficheiro o fim da string, como o ficheiro é de texto, um marcador normal é o '\n' 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