Jump to content

Guardar dados em ficheiro txt


whoami-r

Recommended Posts

whoami-r

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

 

Link to post
Share on other sites
HappyHippyHippo

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

  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Link to post
Share on other sites
whoami-r
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);

 

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

 

Link to post
Share on other sites
HappyHippyHippo

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

 

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

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.