Ir ao conteúdo
  • Cadastre-se

Salvar dados em C


Posts recomendados

Estou querendo montar um sistema que faça a gestão de funcionarios, clientes, produtos, etc... 

Mas estou com problema na hr de salvar os dados, os dados ficam ilegiveis.

aqui está a função, se alguem puder dar uma dica de como salvar os dados e ficarem legiveis quando tiver que mostrar, fico agradecido.

 

void cadCli(){
    FILE *arquivo;
    int opt,k;
    CadastroC c;
    
    arquivo = fopen("Cadastros.txt", "wb");
    
    if(arquivo == NULL){
        printf("Deu ruim na abertura do arquivo.");
    }
    else{
        do{
        system("cls");
        cabecalhoP();
        printf("CADASTRO DE CLIENTE.");
        fflush(stdin);
        printf("\n\nNome: ");
        gets(c.nome);
        fflush(stdin);
        printf("CPF: ");
        gets(c.CPF);
        //scanf("%ld",&c.CPF);
        fflush(stdin);
        printf("RG: ");
        gets(c.RG);
        //scanf("%ld",&c.RG);
        fflush(stdin);
        printf("Endereço: ");
        gets(c.endereco);
        fflush(stdin);
        printf("Telefone: ");
        scanf("%s",&c.tel);
        
        system("cls");
        cabecalhoP();
        printf("CONFIRMARÇÃO DE CADASTRO.");        
        printf("\n\nNome: %s",c.nome);
        printf("\nCPF: %s",c.CPF);
        printf("\nRG: %s",c.RG);
        printf("\nEndereço: %s",c.endereco);
        printf("\nTelefone: %s\n",c.tel);
        printf("\nDeseja salvar os dados ?");
        printf("\n1 - Sim.\n2 - Não.");
        printf("\nOpção: ");
        scanf("%d",&k);
        if(k==1){
        fwrite(&c, sizeof(CadastroC),5,arquivo);
        printf("\nCliente cadastrado com sucesso.\n");
        system("PAUSE");
        }else{
            printf("\nDados excluídos.\n");
            system("PAUSE");
        }                
        printf("\nDeseja continuar cadastrando ?");
        printf("\n1 - Sim.");
        printf("\n2 - Não.");
        printf("\nOpção: ");
        scanf("%d", &opt);
        }while(opt==1);
        fclose(arquivo);
        system("cls");
        getchar();
}}

void listarC(){
    FILE* arquivo;
    CadastroC c;
    
    arquivo = fopen("Cadastros.txt", "r");
    
    if(arquivo == NULL){
        cabecalhoP();
        printf("Deu ruim na abertura do arquivo.");
    }
    else{
        cabecalhoP();
        while(fread(&c, sizeof(CadastroC), 1, arquivo)==1){
        printf("\n\nNome: %s",c.nome);
        printf("\nCPF: %s",c.CPF);
        printf("\nRG: %s",c.RG);
        printf("\nEndereço: %s",c.endereco);
        printf("\nTelefone: %s\n",c.tel);
        }
    }
    fclose(arquivo);
    system("PAUSE");
}

Link para o comentário
Compartilhar em outros sites

Você realmente precisa que os dados sejam legíveis ao abrir o arquivo em um editor de texto? Afinal esses dados só serão uteis para o seu programa, então seria suficiente se puder apenas exibir essas informações no próprio programa.

 

No seu código o arquivo é aberto em modo de escrita binária (usando o parâmetro "wb" no fopen() ), para salvar em modo texto é necessário abrir o arquivo em modo de escrita de texto (parâmetro "w").

 

E são usados outros comandos para escrita para modo texto (fwrite() é para modo binário), como fprintf() e fputs(), que funcionam de forma parecida com o printf() e puts() exceto que você indica o arquivo de saída onde irá imprimir o texto.


Ex:

//Escreve 1234 no arquivo:
fprintf(arquivo, "%d\n", 1234);

Obs: Note que fprintf() pode ser usado para substituir printf(), basta usar stdout como parâmetro de arquivo do fprintf() para escrever para a saída padrão.

 

 

E, similarmente, para ler os dados dos arquivos de texto é necessário usar funções como fscanf() ou fgets().

 

 

 

Lidar com arquivos em modo texto é mais complexo, logo tende a causar mais erros na programação. Para salvar dados geralmente este não é o modo mais recomendado. Só se for necessário permitir a edição manual das informações em modo texto, o que normalmente não é uma boa ideia, o melhor é fazer modificações apenas através do próprio programa.

 

A escrita em modo texto é melhor para gerar saídas do programa, como relatórios e/ou resultados do programa a serem lidos pelo usuário.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

3 horas atrás, isrnick disse:

Você realmente precisa que os dados sejam legíveis ao abrir o arquivo em um editor de texto? Afinal esses dados só serão uteis para o seu programa, então seria suficiente se puder apenas exibir essas informações no próprio programa.

 

No seu código o arquivo é aberto em modo de escrita binária (usando o parâmetro "wb" no fopen() ), para salvar em modo texto é necessário abrir o arquivo em modo de escrita de texto (parâmetro "w").

 

E são usados outros comandos para escrita para modo texto (fwrite() é para modo binário), como fprintf() e fputs(), que funcionam de forma parecida com o printf() e puts() exceto que você indica o arquivo de saída onde irá imprimir o texto.


Ex:


//Escreve 1234 no arquivo:
fprintf(arquivo, "%d\n", 1234);

Obs: Note que fprintf() pode ser usado para substituir printf(), basta usar stdout como parâmetro de arquivo do fprintf() para escrever para a saída padrão.

 

 

E, similarmente, para ler os dados dos arquivos de texto é necessário usar funções como fscanf() ou fgets().

 

 

 

Lidar com arquivos em modo texto é mais complexo, logo tende a causar mais erros na programação. Para salvar dados geralmente este não é o modo mais recomendado. Só se for necessário permitir a edição manual das informações em modo texto, o que normalmente não é uma boa ideia, o melhor é fazer modificações apenas através do próprio programa.

 

A escrita em modo texto é melhor para gerar saídas do programa, como relatórios e/ou resultados do programa a serem lidos pelo usuário.

o que me sugere para salvar os dados ?

Link para o comentário
Compartilhar em outros sites

 

2 horas atrás, Jhonatan Dias disse:

o que me sugere para salvar os dados ?

O que você já está usando, ou seja salvar os dados no arquivo em modo binário, usando fwrite() pra escrever os valores da struct inteira para o arquivo, e usar fread() quando precisar ler do arquivo.

 

E seu programa é o responsável por adicionar, editar e/ou exibir na tela os dados do arquivo.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

2 horas atrás, isrnick disse:

 

O que você já está usando, ou seja salvar os dados no arquivo em modo binário, usando fwrite() pra escrever os valores da struct inteira para o arquivo, e usar fread() quando precisar ler do arquivo.

 

E seu programa é o responsável por adicionar, editar e/ou exibir na tela os dados do arquivo.

Ok, estou usando, mas na hr que mando o programa fazer a leitura e mostrar na tela, fica ilegível.

 

olha a imagem.

Capturar.PNG

Link para o comentário
Compartilhar em outros sites

Sem ter o código completo não podemos testar, e o sem ver a definição da struct CadastroC não consigo analisar se tem algum problema na entrada dos dados.

 

Mas o problema pode estar aqui:

fwrite(&c, sizeof(CadastroC),5,arquivo);

Onde você colocou o parâmetro 5 indicando que tem 5 items em "c", mas "c" não é um vetor de 5 posições, é apenas uma variável comum do tipo CadastroC, logo o valor deveria ser 1 para armazenar apenas 1 CadastroC.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

32 minutos atrás, isrnick disse:

Sem ter o código completo não podemos testar, e o sem ver a definição da struct CadastroC não consigo analisar se tem algum problema na entrada dos dados.

 

Mas o problema pode estar aqui:


fwrite(&c, sizeof(CadastroC),5,arquivo);

Onde você colocou o parâmetro 5 indicando que tem 5 items em "c", mas "c" não é um vetor de 5 posições, é apenas uma variável comum do tipo CadastroC, logo o valor deveria ser 1 para armazenar apenas 1 CadastroC.

KKKKK nao acredito que era só isso, eu tava pensado que o 5 ali seria pra gravar as 5 linhas kkkk, obrigado, consegui dar continuidade, muito obrigado mesmo.

nem meu professor tinha conseguido me dar uma boa dica de como arrumar isso kkk valeu ;)

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!