Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

riqu3s

Listar a partir de ficheiro txt

Mensagens Recomendadas

riqu3s

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

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
riqu3s
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"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

  • Voto 1

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
riqu3s

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.