Jump to content
whoami-r

Listar a partir de ficheiro txt

Recommended Posts

whoami-r

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);
        }
    }
}

 

Share this post


Link to post
Share on other sites
HappyHippyHippo

já que referes que dá erro, apresenta aqui todo o output de erro que te é apresentado


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
whoami-r
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"

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

  • Vote 1

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
whoami-r

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

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.