Ir ao conteúdo
  • Cadastre-se

C Como salvar e ler dados específicos em C?


filipefreitas11

Posts recomendados

Gente, sou BASTANTE iniciante em C. Não tenho nem 5 meses de estudo.

Estou tentando fazer um sistema que salve os dados e imprima uma lista de acordo com as especificações que o usuario desejar.

 

Porém, quando coloco para salvar, não aparece no sistema o cadastro que foi feito.

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>


struct dadosPrestador{
    int idade, placa, cpfcnpj, cnh, telefone;
    char porte, pets;
    char nome[30];
    
}prestador[30];


struct dadosCliente{
    int idade, cpfcnpj;
    char nome[30];
}cliente[30];

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
FILE *arqCliente;
FILE *arqPrestador;

void carregarDados(){
    int c,p, clienteAtual, prestadorAtual;
    struct dadosPrestador prest;
    struct dadosCliente cli;

    arqCliente = fopen("arquivoCliente.txt","r");
    arqPrestador = fopen("arquivoPrestador.txt","r");

    if (arqCliente!=NULL && arqPrestador!=NULL){
        p=0;
        prestadorAtual=0;
        while (!feof(arqPrestador)){
            fscanf(arqPrestador,"CPF/CNPJ: %d Idade: %d Placa: %d CNH: %d Telefone: %d Porte: %s Pets: %s Nome %s\n",&prest.cpfcnpj, &prest.idade, &prest.cnh, &prest.telefone, prest.porte, prest.pets, prest.nome);
            prestador[p]=prest;
            p++;
        }
        
        c=0;
        clienteAtual=0;
        while (!feof(arqCliente)){
            fscanf(arqCliente,"CPF/CNPJ: %d Idade: %d Nome %s\n",&cli.cpfcnpj, &cli.idade, cli.nome);
            cliente[c]=cli;
            c++;
        }
        

        fclose(arqCliente);
        fclose(arqPrestador);
    }
}

void salvarDados(){
    int c,p, clienteAtual, prestadorAtual;
    struct dadosPrestador prest;
    struct dadosCliente cli;

    arqCliente = fopen("arquivoCliente.txt","w");
    arqPrestador = fopen("arquivoPrestador.txt","w");

    if (arqCliente==NULL || arqPrestador==NULL){
        printf("Problemas ao criar ou recriar o(s) arquivo(s)");
    }else{

        for(c=0;c<30;c++){
            if(cliente[c].cpfcnpj != -1){
                fprintf(arqCliente,"CPF/CNPJ: %d Idade: %d Nome %s\n",cliente[c].cpfcnpj, cliente[c].idade, cliente[c].nome);
            }
        }
        
        for(p=0;p<30;p++){
            if(prestador[p].cpfcnpj != -1){
                fprintf(arqPrestador,"CPF/CNPJ: %d Idade: %d Placa: %d CNH: %d Telefone: %d Porte: %s Pets: %s Nome %s\n",prestador[p].cpfcnpj, prestador[p].idade, prestador[p].cnh, prestador[p].telefone, prestador[p].porte, prestador[p].pets, prestador[p].nome);
            }
        }
        fclose(arqCliente);
        fclose(arqPrestador);
    }
}

int localizardadosCliente(int cSet){
    int s=0;
    while (cliente[s].cpfcnpj != cSet && s<29){
        s++;
    }
    if (cliente[s].cpfcnpj == cSet){
        return s; 
    }

    return -9; 
}

int localizardadosPrestador(int cSet){
    int s=0;
    while (prestador[s].cpfcnpj != cSet && s<29){
        s++;
    }
    if (prestador[s].cpfcnpj == cSet){
        return s; 
    }

    return -9; 
}


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void acessarDados(){
    int pCPF, cpfcnpjp, cpfcnpjc;
    char tipodeconta, confiralt;
    
    system("cls");
    printf("\nACESSE SUA CONTA OU CONFIRA SEUS DADOS CADASTRADOS NO SISTEMA.\n");
    printf("\nPrimeiramente, digite se sua conta é do tipo [C] Cliente ou [P] Prestador.\n");
    scanf(" %c", &tipodeconta);
    fflush(stdin);

    if (tipodeconta == 'P' || tipodeconta == 'p'){
        printf("\nDigite seu CPF ou CNPJ.\n");
        scanf("%d",&cpfcnpjp);
        fflush(stdin);
        
        pCPF = localizardadosPrestador(cpfcnpjp);
        if (pCPF !=-9){
            printf("\nNome: %s\n", prestador[pCPF].nome);
            printf("\nIdade: %d\n", prestador[pCPF].idade);
            printf("\nPlaca do veículo: %d\n", prestador[pCPF].placa);
            printf("\nPorte: %s\n", prestador[pCPF].porte);
            printf("\nCNH: %d\n", prestador[pCPF].cnh);
            printf("\nAceita pets: %s\n", prestador[pCPF].pets);
            
            printf("\n\nDeseja alterar seus dados? [S] Sim / [N] Não.\n\n");
            scanf("%c", &confiralt);
            
            if (confiralt == 'S'|| confiralt == 's'){
            printf("Nome: ");
            scanf("%c", &prestador[pCPF].nome);
            fflush(stdin);
            
            printf("Idade: ");
            scanf("%d", &prestador[pCPF].idade);
            fflush(stdin);
            
            printf("Telefone: ");
            scanf("%d", &prestador[pCPF].telefone);
            fflush(stdin);
            
            printf("\nPlaca do veículo: \n");
            scanf("%d", &prestador[pCPF].placa);
            fflush(stdin);
            
            printf("\nPorte do veículo: [P] Pequeno // [M] Médio // [G] Grande \n");
            scanf("%c",&prestador[pCPF].porte);
            fflush(stdin);
            
            printf("\nCNH:  \n");
            scanf("%d", &prestador[pCPF].cnh);
            fflush(stdin);
            
            printf("\nAceita pets? [S] Sim // [N] Não: \n");
            scanf("%c",&prestador[pCPF].pets);
            fflush(stdin);
            
            printf("\nVocê foi recadastrado!\n");

            }else if (confiralt == 'N'|| confiralt == 'n'){
                printf("\nOk! Saindo do sistema.\n");
            }else{
                printf("\nCaracter inválido. Tente novamente!");
            }
                
        }else{
            printf("\nCPF/CNPJ não localizado. Tente novamente.\n");
        }
    }else if (tipodeconta == 'C' || tipodeconta == 'c'){
        printf("\nDigite seu CPF ou CNPJ.\n");
        scanf("%d",&cpfcnpjc);
        pCPF = localizardadosCliente(cpfcnpjc);
        if (pCPF !=-9){
            printf("\nNome: %s\n", prestador[pCPF].nome);
            printf("\nIdade: %d\n", prestador[pCPF].idade);
            
            printf("\n\nDeseja alterar seus dados? [S] Sim / [N] Não.\n\n");
            scanf("%c", &confiralt);
            
            if (confiralt == 'S'|| confiralt == 's'){
            printf("Nome: ");
            scanf("%c",&cliente[pCPF].nome);
            fflush(stdin);
            
            printf("Idade: ");
            scanf("%d", &cliente[pCPF].idade);
            fflush(stdin);
            
            printf("\nVocê foi recadastrado!\n");

            }else if (confiralt == 'N'|| confiralt == 'n'){
                printf("\nOk! Saindo do sistema.\n");
            }else{
                printf("\nCaracter inválido. Tente novamente!");
            }

        }else{
            printf("\nCPF/CNPJ não localizado. Tente novamente.\n");
        }
    }else{
        printf("\nVocê digitou um tipo de conta errado! Tente novamente.\n");
    }
    
    system("pause");
};

void procurarPrestador(){
    int pCPF, cpfcnpj;
    char portepes, petspes, moveispes;
    
    system("cls");
    printf("\nPROCURE UM PRESTADOR DE MUDANÇA CADASTRADO NO SISTEMA QUE MAIS SE ADEQUE A SUA NECESSIDADE.\n");
    printf("\nDigite seu CPF ou CNPJ.\n");
    scanf("%d",&cpfcnpj);
    
    // perguntar o porte
    pCPF = localizardadosCliente(cpfcnpj);
    if (pCPF !=-9){
        printf("\nOlá, %s! Encontre um prestador de mudança respondendo algumas perguntas básicas a seguir: \n", &cliente[pCPF].nome);
        printf("\n[1] Qual o porte do veículo que melhor se adequa a seu serviço? [P] Pequeno // [M] Médio // [G] Grande. \n");
        scanf("%c", &portepes);
        if (portepes != 'P' && portepes != 'p' && portepes != 'M' && portepes != 'm' && portepes != 'G' && portepes != 'g'){
            printf("Você digitou um caractere errado! Tente novamente.");
        }else{
            printf("\n[2] Necessita transportar pets? [S] Sim // [N] Não. \n");
            scanf("%c", &petspes);
            if (portepes != 'S' && portepes != 's' && portepes != 'N' && portepes != 'n'){
                printf("Você digitou um caractere errado! Tente novamente.");
            }else{
                
                // listar todos os prestadores que tem o porte e a indicação do pets
                
                printf("\n[3] Há móveis com partes desmontáveis e de fácil perda? [S] Sim // [N] Não. \n");
                scanf("%c", &moveispes);
                if (portepes != 'S' || portepes != 's' || portepes != 'N' || portepes != 'n'){
                    printf("Você digitou um caractere errado! Tente novamente.");
                }else{
                    printf("Aqui estão todas as opções disponiveis para você:"); aqui que não consegui fazer corretamente
                
                    
            }
        }

        }
                    
    }else{
        printf("\nVocê não tem acesso a esta página. Cadastre-se, como CLIENTE, e tente novamente.\n");
    }
    system("pause");
};

void excluirDados(){
    int pCPF, cpfcnpjp, cpfcnpjc;
    char tipodeconta, confiralt;
    
    system("cls");
    printf("\nACESSE SUA CONTA OU CONFIRA SEUS DADOS CADASTRADOS NO SISTEMA.\n");
    printf("\nPrimeiramente, digite se sua conta é do tipo [C] Cliente ou [P] Prestador.\n");
    scanf(" %c", &tipodeconta);
    fflush(stdin);

    if (tipodeconta == 'P' || tipodeconta == 'p'){
        printf("\nDigite seu CPF ou CNPJ.\n");
        scanf("%d",&cpfcnpjp);
        pCPF = localizardadosPrestador(cpfcnpjp);
        if (pCPF !=-9){        
            printf("\n\nDeseja mesmo excluir sua conta? [S] Sim / [N] Não.\n\n");
            scanf("%c", &confiralt);
            
            if (confiralt == 'S'|| confiralt == 's'){
            prestador[pCPF].cpfcnpj=-1;
            printf("\nSeu cadastro foi excluido com sucesso!\n");

            }else if (confiralt == 'N'|| confiralt == 'n'){
                printf("\nOk! Saindo do sistema.\n");
            }else{
                printf("\nCaracter inválido. Tente novamente!");
            }
                
        }else{
            printf("\nCPF/CNPJ não localizado. Tente novamente.\n");
        }
    }else if (tipodeconta == 'C' || tipodeconta == 'c'){
        printf("\nDigite seu CPF ou CNPJ.\n");
        scanf("%d",&cpfcnpjc);
        pCPF = localizardadosCliente(cpfcnpjc);
        if (pCPF !=-9){
            printf("\n\nDeseja mesmo excluir sua conta? [S] Sim / [N] Não.\n\n");
            scanf("%c", &confiralt);
            
            if (confiralt == 'S'|| confiralt == 's'){
            cliente[pCPF].cpfcnpj=-1;
            printf("\nSeu cadastro foi excluido com sucesso!\n");

            }else if (confiralt == 'N'|| confiralt == 'n'){
                printf("\nOk! Saindo do sistema.\n");
            }else{
                printf("\nCaracter inválido. Tente novamente!");
            }

        }else{
            printf("\nCPF/CNPJ não localizado. Tente novamente.\n");
        }
    }else{
        printf("\nVocê digitou um tipo de conta errado! Tente novamente.\n");
    }
    
    system("pause");
};

void acessarConta (){
   int op;

    do{
        system("cls");
        printf("\n[1] – Acessar e/ou alterar meus dados.\n");
        printf("\n[2] – Procurar prestador de serviço.\n");
        printf("\n[3] – Excluir meus dados.\n");
        printf("\n[4] – Retornar ao menu principal.\n");
        printf("\n======================================\n");
        printf("\nEscolha a opção desejada no menu digitando o número correspondente.\n");
        scanf("%d", &op);

        switch (op){
            case 1: acessarDados(); break;
            case 2: procurarPrestador(); break;
            case 3: excluirDados(); break;
            case 4: break;
            default: printf("Opcao invalida!\n\n");system("pause");
        };

    }while (op!=4);
};

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void cadastrarPrestador (){
    int cpfcnpjp, pCPF, pLivre;
        
    system("cls");
    printf("CADASTRAR PRESTADOR\n\n");
    
    pLivre = localizardadosPrestador(-1);
    
    if(pLivre == -9) { 
        printf("\nNao há vaga para cadastrar novos usuários! Consulte setor de TI.\n");
    }else{
        printf("\nDigite o CPF/CNPJ.\n");
        scanf("%d", &cpfcnpjp);
        fflush(stdin);
        
        pCPF = localizardadosPrestador(cpfcnpjp);
        if (pCPF != -9){
            printf("\nCPF/CNPJ já cadastrado!\n");
        }else{
            prestador[pLivre].cpfcnpj == cpfcnpjp;
            
            printf("Nome: ");
            scanf("%c",&prestador[pLivre].nome);
            fflush(stdin);
            
            printf("Idade: ");
            scanf("%d", &prestador[pLivre].idade);
            fflush(stdin);
            
            printf("Telefone: ");
            scanf("%d", &prestador[pLivre].telefone);
            fflush(stdin);
            
            printf("\nPlaca do veículo: \n");
            scanf("%d", &prestador[pLivre].placa);
            fflush(stdin);
            
            printf("\nPorte do veículo: [P] Pequeno // [M] Médio // [G] Grande \n");
            scanf("%c",&prestador[pLivre].porte);
            fflush(stdin);
            
            printf("\nCNH:  \n");
            scanf("%d", &prestador[pLivre].cnh);
            fflush(stdin);
            
            printf("\nAceita pets? [S] Sim // [N] Não: \n");
            scanf("%c",&prestador[pLivre].pets);
            fflush(stdin);
            
            printf("\nVocê foi cadastrado!\n");
        }
    }
    system("pause");
};

void cadastrarCliente (){
    int cpfcnpjc, pCPF, pLivre;
        
    system("cls");
    printf("CADASTRAR CLIENTE\n\n");
    
    pLivre = localizardadosCliente(-1);
    
    if(pLivre == -9) { 
        printf("\nNao há vaga para cadastrar novos usuários! Consulte setor de TI.\n");
    }else{
        printf("\nDigite o CPF/CNPJ.\n");
        scanf("%d", &cpfcnpjc);
        fflush(stdin);
        
        pCPF = localizardadosPrestador(cpfcnpjc);
        
        if (pCPF != -9){
            printf("\nCPF/CNPJ já cadastrado!\n");
        }else{
            cliente[pLivre].cpfcnpj == cpfcnpjc;
            
            printf("Nome: ");
            scanf("%c",&cliente[pLivre].nome);
            fflush(stdin);
            
            printf("Idade: ");
            scanf("%d", &cliente[pLivre].idade);
            fflush(stdin);
            
            printf("\nVocê foi cadastrado!\n");
        }
    }
    system("pause");
};

void inicializarCadastro(){
    int c,p;

    for(c=0;c<30;c++){
        cliente[c].cpfcnpj=-1;
    }
    
    for(p=0;p<30;p++){
        prestador[p].cpfcnpj=-1;
    }
}
    


int main(){   
    
    int opcao;
    setlocale (LC_ALL,"Portuguese");
    
    inicializarCadastro();
    carregarDados();
    
    do{
        system("cls");
        printf("\n======================================\n");
        printf("\nSTM - Sistema de Transporte Mobiliario\n");
        printf("\n======================================\n");
        printf("\nEscolha a opção desejada no menu digitando o número correspondente.\n");

        printf("\n[1] – Acessar minha conta.");
        printf("\n[2] – Cadastrar-se como prestador.");
        printf("\n[3] – Cadastrar-se como cliente.");
        printf("\n[4] – Encerrar.\n\n");
        scanf("%d", &opcao);

        switch (opcao){        
            case 1: acessarConta(); break;    
            case 2: cadastrarPrestador(); break;
            case 3: cadastrarCliente();break;
            case 4:
                printf("\n\nO sistema será encerrado.\n\n");
                salvarDados();
                break;
            default: printf("\nOpcao invalida!\n");system("pause");
        }
        
    }while (opcao != 4);
    
    return 0;
}

 

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

Olá!

 

Seu programa tem quase 700 linhas e parece que escreveu sem testar muita coisa.

 

Esse não é um bom caminho. Nem os caras com anos de experiência imagino que escrevam assim.

 

Se programa há 5 meses então esse não é seu primeiro nem segundo programa e já teve algo de onde começar.

 

Sobre o programa

 

Seu código tem quase todos os problemas que se vê em todos os programas desses que aparecerem por exemplo nesse forum e acho que a razão é simples: professores muito ruins, material de estudo ruim, cursos sem livro-texto, conceitos mal explicados ou nem explicados. Tenho uma lista dos problemas comuns e acho que tem 20 deles. Assim quanto reaparecem posso apenas copiar e colar aqui.

 

Talvez tenha mais ajuda num forum como esse aqui do que tem tido nas aulas 😞

 

Exemplo 1

 

int main()
{
    int opcao;
    setlocale(LC_ALL, "Portuguese");

    inicializarCadastro();
    carregarDados();

    do {
        system("cls");
        printf(
            "\n======================================\n");
        printf(
            "\nSTM - Sistema de Transporte Mobiliario\n");
        printf(
            "\n======================================\n");
        printf(
            "\nEscolha a opção desejada no menu digitando "
            "o número correspondente.\n");

 

funções void e sem argumentos não tem sentido nenhum. A única conhecida por isso é uma clássica Usage() que há uns 40 anos se escreve para mostrar como usar o programa quando faltam argumentos, e encerrar em seguida. Por isso não tem argumentos e não retorna nada: vai encerrar o programa. 

 

  • você tem uma função inicializarCadastro() e tem até structs em seu programa. Mas não tem um cadastro. Não acha estranho? É estranho. E ruim. Vai ter um trabalho enorme para concluir um programa quando o modelo dos dados não corresponde aos dados. Seus dados são dois cadastros e uma relação entre eles.
    • Prestador
    • Cliente
    • Serviço

Mas onde está isso em seu programa? 

 

Prestadores e Clientes são pessoas, compartilham campos mas isso desaparece em seu programa

 

struct dadosPrestador
{
    int  idade, placa, cpfcnpj, cnh, telefone;
    char porte, pets;
    char nome[30];

} prestador[30];

struct dadosCliente
{
    int  idade, cpfcnpj;
    char nome[30];
} cliente[30];

 

Essas estruturas são os seus cadastros? Simples vetores. Quanto cabe em cada um? Quantos tem num dado momento? Claro que isso faz parte dos cadastros mas você não escreveu isso. Então vai ter que ter variáveis soltas em algum lugar para controlar isso. Vai perder muito tempo e seu programa vai ficar muito frágil.

 

Pior: essas estruturas são globais então seu programa só funciona para essas e com esses nomes. 

 

FILE* arqCliente;
FILE* arqPrestador;

 

NUNCA deixe ponteiros assim soltos e sem valor inicial. Porque não declarar quando for abrir o arquivo? Porque tem que ser global?

 

void carregarDados()
{
// ...

 

Pois é. 

 

No mundo normal uma função dessas seria 

 

    int carregarDados( Cadastro* cad, const char* arquivo )
    {
//...

 

 

E você iria carregar dados em cad a partir do arquivo 'arquivo' e retornar um código de erro ou zero se der tudo certo, ou talvez retornar o total de itens carregados no tal cadastro.

 

Como não fez nada disso mas vai precisar disso tem mais fragilidade e dificuldade.

 

        printf("\nDigite seu CPF ou CNPJ.\n");
        scanf("%d", &cpfcnpjp);
        fflush(stdin);

 

pois é: leia o manual. scanf() retorna um int. TESTE sempre o retorno. Não há propósito em seguir se não ler nada.

 

fflush() não está definida para a entrada. Funciona por insistência em um ou outro compilador mas não está definida. o buffer na entrada é tratado de outro modo. fflush() só está definida para arquivos de saída.

 

Não use acentos em comentários. Não acrescenta anda e pode não imprimir direito por exemplo.

 

Alguns problemas, agora copiando de minha lista

 

  •    Não use acentos em nomes de variáveis ou comentários. Evite em strings  a menos que o enunciado exija. Não vai aprender nada e só vai ter problemas
  • Não use system() para nada. Não estará fazendo nada. Não há praticamente nada que possa fazer com system() que não possa fazer em C ou C++. system() foi escrita em C e o sistema quase todo também. E em geral é proibido em empresas e escolas afinal: é um risco grande de segurança. E se tem algo que você não possa inicialmente fazer em C ou C++ talvez não deva mesmo fazer. E uma pause em um programa é um desastre se o programa de correção for automáico. Pense nisso.
  • main() deve ser a primeira função de seu programa. Se possível em um arquivo separado. Há muitas razões para isso, mas em especial vai gostar de começar a ler seus programas e os de outros a partir de main() E a partir do início do texto. Ao mesmo tempo. E ao usar protótipos fica trivial passar as declarações todas para um arquivo .h que é o mais prático afinal.
  • evite retornar void de funções: em geral é um desperdício. E muitas vezes um erro. Use argumentos nas funções, e retorne algo delas. É mais esperto e expressivo.
  • Use alguma ordem em suas funções, como a ordem alfabética por exemplo. Vai gostar disso quando seu programa tiver 50 funções ao invés de umas poucas. Muitos IDE mostram uma lista das funções, em geral na ordem em que foram declaradas, de modo que você pode clicar no nome e o editor vai direto para o código, mas se estiverem em ordem é claro que você só ganha.
  • Nunca use variáveis globais. Isso é um pesadelo e sempre vai cair na sua cabeça. Em geral é proibido em empresas e escolas. Não declare NADA que use memória  fora de main().
  • Não declare mais que uma variável por linha. Não acrescenta nada e só dificulta a leitura. Inicialize todas as variáveis.
  • Nunca leia valores do teclado para alimentar seu programa antes dele estar rodando. Só vai te atrasar e não acrescenta absolutamente nada. Use constantes, use funções que retornam a estrutura preenchida. Leia de arquivos: é trivial em C. Ao terminar os  testes aí sim incorpore a leitura. Um programa interativo é chato para testar. Durante o desenvolvimento ninguém quer interagir com o programa.
  • Alinhe seu código com algum critério. Evite longas linhas com mais de 60 colunas.
  • Use nomes significativos para as variáveis e fuja de coisas como aux, aux1 e aux2. E não use nomes de variáveis enormes porque em uma expressão fica muito difícil de ler.
  • Se seu programa tem um menu, entenda que o menu() deve mostrar as opções e ler e retornar a opção. Um void menu() é um desperdício.
  • scanf() foi escrita para ler entrada formatada. Não use para ler do teclado, que claramente não é entrada formatada. Só vai dar mais trabalho. Muito mais trabalho.
  • Ao usar scanf() ou alguma função da família, como fscanf() entenda que ela retorna um valor. E teste. É ingênuo deixar o programa seguir sem testar. TESTE sempre. Exemplo: para 5 especificadores --- aquelas coisas com % na frente e que não tem um asterisco nem outro '%' --- como "%d %d %f %f %d" scanf() pode ler de 0 a 5 itens ou dar erro e retornar -1. Então teste o retorno que vai estar entre -1 e 5...
  • não use fflush(): isso só está definido para fluxos de saída. Em alguns compiladores pode até funcionar, mas é um sinal de fez algo errado e não sabe como consumir os dados.
  • Não existe "lixo de teclado": necessidades como de flush() na entrada indicam apenas que não entendeu bem o que está lendo e o que é a entrada via teclado, free form: o usuário pode digitar qualquer coisa e é o seu programa que tem que se virar O teclado tem ao menos 105 teclas de liberdade e o usuário pode digitar qualquer coisa em qualquer ordem.  
  • Nunca escreva um programa interativo. Não vai aprender nada. Não vai ganhar nada. Escreva e teste todas as funções. DEPOIS de tudo testado coloque a parte interativa. isso inclui claro o eventual menu.
  • evite ler do teclado a menos que seja o objetivo do problema. Ler de arquivos é muito mais simples, seguro e fácil de reproduzir. Não há razão para ficar parado em frente a tela minutos inventando nomes de campos e coisas assim: o efeito é que vai acabar não testando direito porque é difícil controlar e repetir testes.
  • Não misture entrada de dados ou formatação com a apresentação dos dados ou a lógica do programa, Isso é um desastre para manutenção e desenvolvimento
  • Um printf() de 6 linhas é muito, mas muito melhor que 6 printf() de 1 linha. E se só vai mostrar o texto puts() é ainda melhor e dezenas de vezes mais rápido que uma série de printf().
  • Ao usar uma estrutura de dados como uma lista, uma pilha ou fila entenda que ela é um container e nada tem a ver com os dados. Não misture NUNCA os dados com a estrutura porque só via complicar tudo. Em especial vai ficar muito mais difícil aproveitar a estrutura em outros programas, e essa é toda a razão de escrever um programa.

 

Sugiro considerar essas coisas e rever o programa. Vai perder muito menos tempo

 

  • Obrigado 2
Link para o comentário
Compartilhar em outros sites

@filipefreitas11    na sua função de carregar_dados , ela não lê nada no arquivo , pois a função fscanf , não funciona  assim , 

/// caract juntos aos especificadores . ERRO
fscanf(arqPrestador,"CPF/CNPJ: %d Idade: %d Placa: %d CNH: %d Telefone: %d Porte: %s Pets: %s Nome %s\n",
       &prest.cpfcnpj, &prest.idade, &prest.cnh, &prest.telefone, prest.porte, prest.pets, prest.nome  );

que pode ser assim :
fscanf
(      
    arqPrestador  ,   "%d%d%d%d%d%s%s%s",
  & prest.cpfcnpj , & prest.idade       , 
  & prest.cnh     , & prest.telefone    , 
  & prest.placa   ,   prest.porte       , 
    prest.pets    ,   prest.nome     
);

e  esses dados podem ser do tipo string , pois você não vai fazer nenhum cálculo usando eles ,  e também o cpf ou cnpj , vai dar erro , pois serão 11 dígitos , e o valor máximo de um int é  2.147.483.647 , https://qastack.com.br/programming/94591/what-is-the-maximum-value-for-an-int32

melhor seria usar string's:

typedef struct        /// dadosPrestador
{
  char idade   [ 5];
  char placa   [10];
  char cpfcnpj [20];
  char cnh     [20];
  char telefone[15];
  char porte   [10];
  char pets    [10];
  char nome    [30];
} prestador        ;  /// [30];

 

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

Entendi, obrigado @devair1010 @arfneto pelas dicas. Me desculpem pela leiguice. Vou tentar reescrever meu código com todas elas. 

Se não for incomodar muito, vocês sabem alguma forma de'u conseguir imprimir apenas informações específicas? Busca binária, talvez?

 

Por exemplo. Um cliente escolhe as opções porte: MÉDIO && se aceita pets: SIM. Eu quero que liste TODOS os prestadores já cadastrados com essas opções simultâneas. Existe alguma forma?

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

@filipefreitas11 para essa quantia de dados apenas olhe um por 1 um.

 

Acho que deve planejar melhor seus dados. Seus 2 cadastros que nem estão no programa ainda.

 

Depois disso você prepara uma função de busca especificando os critérios de que precisa, como porte grande sem pets. E pode fazer o simples: retornar o próximo item que satisfaz o critério.

 

Busca binária é outra coisa e não faria sentido num cadastro pequeno e com critérios variáveis de pesquisa. Claro que pode usar, mas entenda que isso pressupõe o cadastro sempre ordenado

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

1 hora atrás, arfneto disse:

@filipefreitas11 para essa quantia de dados apenas olhe um por 1 um.

 

Acho que deve planejar melhor seus dados. Seus 2 cadastros que nem estão no programa ainda.

 

Depois disso você prepara uma função de busca especificando os critérios de que precisa, como porte grande sem pets. E pode fazer o simples: retornar o próximo item que satisfaz o critério.

 

Busca binária é outra coisa e não faria sentido num cadastro pequeno e com critérios variáveis de pesquisa. Claro que pode usar, mas entenda que isso pressupõe o cadastro sempre ordenado

 

Acho que entendi... seria o que chamam de lista encadeada? Se não for incomodo demais/chatice minha, poderia dar um exemplo prático?

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

@filipefreitas11 arrume os dados antes, entenda aquelas coisas de que falei.

 

Seu programa sequer tem os cadastros ainda. É difícil pesquisar sem isso 

Não precisa de uma lista ligada para isso. Apenas uma sequencia de estruturas. E olhe uma a uma. Uma lista ligada não vai te dar opções de pesquisa. Tanto faz. Só vai ter mais trabalho.

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

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!