Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

arquivos em C

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    C / C++ arquivos em C

    ae galera, estou tentando aprender o assunto de arquivos em C, mais to achando muito complicado, e não há muitos tópicos da internet sobre esse assunto.
    minha duvida são nas funções de fread e fwrite.

    fazer copias de uma estrutura para outro de arquivos diferentes, fazer alterações em um arquivo, essas coisas..

    os tópicos que tem na internet são mais sobre fputc, fgetc.. que nao me interessa muito, porque quero gravar estruturas, e em arquivos binários!! se alguem puder da um help com algum codigo eu ficarei muito grato!! obrigado a todos!

  • Font Size
    #2
    Dá uma olhada nesse código aí cara, eu que fiz para um trabalho na facul... Não está 100% correto mas dá pra ter uma base muito boa.

    Código HTML:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    
    #define maxProd 10
    #define maxCli 15
    
    struct Produtos
    {
            int codigoProduto[10];
            int quantidade[maxProd];
    };
    
    typedef struct
    {
            int codigoCliente;
            char nome[50];
            char endereco[100];
            char telefone[10];
            int nascimentoDia;
            int nascimentoMes;
            int nascimentoAno;
            Produtos cadProdutos;
    } Cad;
    
    Cad cadastro;
    FILE *arquivoDados;
    FILE *arquivoCodigo;
    FILE *arquivoAux;
    
    /*--------------------------------------ORDENAÇÃO*/
    void bsort(Cad vet[], int t)
    {
      int i,j;
      Cad k;
      
      for (i=0;i<t-1;i++)
      {
        for (j=0;j<t-(i+1);j++)
        {
            if(strcmp(vet[j].nome, vet[j+1].nome) >0)
            {
              k=vet[j];
              vet[j]=vet[j+1];
              vet[j+1]=k;
            }
        }     
      }
    }
    
    
    void ssort(Cad vet[], int t)
    {
       int i,j,min;
       Cad k ;
       
       for (i=0; i<(t-1); i++)
       {     
         min=i;
         for(j=(i+1);j<t;j++)
         {
            if (vet[j].codigoCliente < vet[min].codigoCliente)
               min=j;
         }    
         if (i!=min)
         {
            k=vet[i];
            vet[i]=vet[min];
            vet[min]=k;
         }
       } 
    }
    
    int pesqseq(Cad v[], int busca, int t)
    {
        int i, x;
        for(i=0; i<t; i++)
        {
                 for(x=0; x<maxProd; x++)
                 {
                         if(v[i].cadProdutos.codigoProduto[x] == busca)
                               return i;
                         else
                               if(v[i].cadProdutos.codigoProduto[x] > busca)
                                    return -1;
                 }
              
        }
        return -1;
    }
    /*--------------------------------------------------------ORDENAÇÃO-*/
    
    
    void mtd_CriarArquivo()
    {
       arquivoDados = fopen("arquivo.txt","a");
       if (arquivoDados == NULL)
          arquivoDados = fopen("arquivo.txt","w");
       
       if (arquivoDados == NULL)
       {
          printf("\nO arquivo nao pode ser criado!\n\n");
          system("pause");
          exit(1);            
       }         
    };
    
    int mtd_verificar_limite()
    {
         int total = 0;
         arquivoDados = fopen("arquivo.txt","r");
         fread(&cadastro,sizeof(Cad),1,arquivoDados);
         while(feof(arquivoDados)==0)
         {
               total+=1;
               fread(&cadastro,sizeof(Cad),1,arquivoDados);
         }
         return total;
    }
    
    int mtd_obter_codigo()
    {
        int Codigo = 1;
        arquivoDados = fopen("arquivo.txt","r");
        rewind(arquivoDados);
        fread(&cadastro,sizeof(Cad),1,arquivoDados);
        while(feof(arquivoDados) == 0)
        {                     
            if(cadastro.codigoCliente >= Codigo)
                 Codigo = cadastro.codigoCliente + 1;
            fread(&cadastro,sizeof(Cad),1,arquivoDados);
        }
        fclose(arquivoDados);
        return Codigo;
    }
    
    
    void mtd_cadastrar()
    {
        system("cls");
        int count = 0;
        int opcaoProd = 0;
        int limite = 0;
        
        limite = mtd_verificar_limite();
        
        
        if(limite < maxCli)
        {
        cadastro.codigoCliente = mtd_obter_codigo();
        fflush(stdin);
        system("pause");
        arquivoDados = fopen("arquivo.txt","a");    
        printf("Entre com o nome..............: ");
        gets(cadastro.nome);
        printf("Entre com o endereco..........: ");
        gets(cadastro.endereco);  
        printf("Entre com o telefone..........: ");
        gets(cadastro.telefone);  
        printf("Entre com o dia de nascimento.: ");
        scanf("%d",&cadastro.nascimentoDia);      
        printf("Entre com o mes de nascimento.: ");
        scanf("%d",&cadastro.nascimentoMes);
        printf("Entre com o ano de nascimento.: ");
        scanf("%d",&cadastro.nascimentoAno);
        count = 0;
        while(opcaoProd != 1)
        {
             printf("Digite a opcao (0 - cadastrar produto / 1 - sair): ");
             scanf("%d",&opcaoProd);
             
             if(opcaoProd == 0)
             {
                    if(count >= maxProd)
                    {
                        printf("Quantidade de produtos atingiu o limite!\n");
                    }
                    else
                    {    
                        printf("Entre com o codigo do produto.: ");
                        scanf("%d",&cadastro.cadProdutos.codigoProduto[count]);
                        printf("Entre com a quantidade........: ");
                        scanf("%d",&cadastro.cadProdutos.quantidade[count]);
                        count++;
                    }
             }
             else if(opcaoProd != 0 && opcaoProd != 1)
             {
                    printf("Digito invalido!\n");
             }
             else
             {
                    opcaoProd = 1;
                    printf("Cadastrado com sucesso!");
                    system("pause>null");
             }
        }
        
        fwrite(&cadastro,sizeof(Cad),1,arquivoDados);
        fclose(arquivoDados);
        }
        else
        {
            printf("Impossivel cadastrar.\nLimite excedido!\n");
            system("pause>null");
        }
        
    }
    /*--------------------------------------------------------Opção 1-*/
    
    
    void mtd_removerCli()
    {
       char Nome[50];
       bool existe = false;
       arquivoAux = fopen("auxiliar.txt","w");
       arquivoDados = fopen("arquivo.txt","r");   
       
       fflush(stdin);
       printf("\nQual nome deseja apagar..: ");
       gets(Nome);     
       
       rewind(arquivoDados);
       fread(&cadastro,sizeof(Cad),1,arquivoDados);
       while (feof(arquivoDados)==0) 
       {
           if (strcmp(cadastro.nome,Nome)==0)
               existe = true;
           fread(&cadastro,sizeof(Cad),1,arquivoDados);
        }
        
       
       if(existe == true)
       {
       rewind(arquivoDados);
       fread(&cadastro,sizeof(Cad),1,arquivoDados);
       while (feof(arquivoDados)==0) 
       {
        if (strcmp(cadastro.nome,Nome)!=0)
           fwrite(&cadastro,sizeof(Cad),1,arquivoAux) ;  
    
        fread(&cadastro,sizeof(Cad),1,arquivoDados);     
       }     
       
       fclose(arquivoAux);
       fclose(arquivoDados);
    
       arquivoDados = fopen("arquivo.txt","w");       
       arquivoAux = fopen("auxiliar.txt","r");
    
       rewind(arquivoAux);
       fread(&cadastro,sizeof(Cad),1,arquivoAux);
       while (feof(arquivoAux)==0) 
       {
        fwrite(&cadastro,sizeof(Cad),1,arquivoDados) ;      
        fread(&cadastro,sizeof(Cad),1,arquivoAux);     
       } 
       fclose(arquivoAux);
       fclose(arquivoDados);
          
       printf("\nNome excluido com sucesso.\n");
       system("pause");
       }
       else
       {
          printf("Cliente nao cadastrado!\n");
          system("pause>null");
       }
    }
    
    void mtd_removerProd()
    {
         Cad aux, aux2;
         int produto;
         int count = 0;
         char Nome[50];
         bool existe = false;
         fflush(stdin);
         printf("Digite o nome do cliente...: ");
         gets(Nome);
         printf("Digite o codigo do produto.:");
         scanf("%d",&produto);
         
         FILE *arquivoAux2;
         arquivoDados = fopen("arquivo.txt", "r");
         arquivoAux = fopen("auxiliar.txt","w");
         arquivoAux2 = fopen("auxiliar2.txt","w");
         
         rewind(arquivoDados);
         fread(&cadastro,sizeof(Cad),1,arquivoDados);
         while(feof(arquivoDados)==0)
         {
               if(strcmp(cadastro.nome,Nome)==0)
               {
                    aux2 = cadastro;
                    for(int i=0; i<maxProd; i++)
                    {
                            if(produto == aux2.cadProdutos.codigoProduto[i])
                                  existe = true;
                    }
               }
            fread(&cadastro,sizeof(Cad),1,arquivoDados);   
         }
                    
         
         if(existe)
         {
         rewind(arquivoDados);
         fread(&cadastro,sizeof(Cad),1,arquivoDados);
         while(feof(arquivoDados)==0)
         {
               if(strcmp(cadastro.nome,Nome)!=0)
                   fwrite(&cadastro,sizeof(Cad),1,arquivoAux);
                    
               else
               {
                   count=0;
                   while(count < maxProd)
                   {
                          if(produto == cadastro.cadProdutos.codigoProduto[count])
                          {
                                     aux = cadastro;
                                     aux.cadProdutos.codigoProduto[count] = 0;
                                     aux.cadProdutos.quantidade[count] = 0;
                                     printf("Removido com sucesso!\n");
                                     fwrite(&aux,sizeof(Cad),1,arquivoAux);
                                     count++;
                          }
                          count++;
                   }
                   
               }
         fread(&cadastro, sizeof(Cad), 1, arquivoDados);
         }
         
         fclose(arquivoAux);
         fclose(arquivoAux2);
         fclose(arquivoDados);
         
         arquivoDados = fopen("arquivo.txt", "w");
         arquivoAux = fopen("auxiliar.txt","r");
         arquivoAux2 = fopen("auxiliar2.txt","r");
         
         
         fread(&cadastro,sizeof(Cad),1,arquivoAux);
         while(feof(arquivoAux)==0)
         {
             fwrite(&cadastro,sizeof(Cad),1,arquivoDados);
             fread(&cadastro,sizeof(Cad),1,arquivoAux);
         }
         
         
         fread(&cadastro,sizeof(Cad),1,arquivoAux2);
         while(feof(arquivoAux2)==0)
         {
             fwrite(&cadastro,sizeof(Cad),1,arquivoDados);
             fread(&cadastro,sizeof(Cad),1,arquivoAux2);
         }
         
         fclose(arquivoAux);
         fclose(arquivoAux2);
         fclose(arquivoDados);
                 
         system("pause");
         }
         else
         {
             printf("Produto ou cliente nao existe!\n");
             system("pause;")
         }
    }
    
    void mtd_busca_clienteCod()
    {
         int codigo;
         int i=0;
         bool existe = false;
         Cad aux;
         
         printf("Digite o codigo que deseja buscar: ");
         scanf("%d",&codigo);
         
         arquivoDados = fopen("arquivo.txt","r");
         
         rewind(arquivoDados);
         fread(&cadastro,sizeof(Cad),1,arquivoDados);
         while(feof(arquivoDados)==0)
         {
              if(codigo == cadastro.codigoCliente)
              {
                  existe = true;
                  printf("\nCodigo.......................: %d",cadastro.codigoCliente);
                  printf("\nNome.........................: %s",cadastro.nome);
                  printf("\nEndereco.....................: %s",cadastro.endereco);
                  printf("\nTelefone.....................: %s",cadastro.telefone);
                  printf("\nData de Nascimento...........: %d/%d/%d",cadastro.nascimentoDia, cadastro.nascimentoMes, cadastro.nascimentoAno);
                  printf("\nProdutos que costuma comprar.: \n");
                  printf("\tCodigo-Quantidade\n");   
                  i = 0;  
                  while(i < maxProd)
                  { 
                          if(cadastro.cadProdutos.codigoProduto[i] == 0)
                          i++;
                          else
                          {
                              printf("\t%d", cadastro.cadProdutos.codigoProduto[i]);
                              printf("\t%d\n", cadastro.cadProdutos.quantidade[i]);
                              i++;
                          }
                 }
              }
              fread(&cadastro,sizeof(Cad),1,arquivoDados);
         }
         
         fclose(arquivoDados);
         
         if(!existe)
              printf("Cliente nao cadastrado!\n");
              system("pause");
    }
    
    
    
    void mtd_busca_clienteNome()
    {
         char Nome[50];
         int i=0;
         bool existe = false;
         Cad aux;
         
         fflush(stdin);
         printf("Digite o nome que deseja buscar: ");
         gets(Nome);
         
         arquivoDados = fopen("arquivo.txt","r");
         
         rewind(arquivoDados);
         fread(&cadastro,sizeof(Cad),1,arquivoDados);
         while(feof(arquivoDados)==0)
         {
              if(strcmp(Nome,cadastro.nome)==0)
              {
                  existe = true;
                  printf("\nCodigo.......................: %d",cadastro.codigoCliente);
                  printf("\nNome.........................: %s",cadastro.nome);
                  printf("\nEndereco.....................: %s",cadastro.endereco);
                  printf("\nTelefone.....................: %s",cadastro.telefone);
                  printf("\nData de Nascimento...........: %d/%d/%d",cadastro.nascimentoDia, cadastro.nascimentoMes, cadastro.nascimentoAno);
                  printf("\nProdutos que costuma comprar.: \n");
                  printf("\tCodigo-Quantidade\n");   
                  i = 0;  
                  while(i < maxProd)
                  { 
                          if(cadastro.cadProdutos.codigoProduto[i] == 0)
                          i++;
                          else
                          {
                              printf("\t%d", cadastro.cadProdutos.codigoProduto[i]);
                              printf("\t%d\n", cadastro.cadProdutos.quantidade[i]);
                              i++;
                          }
                 }
                 system("pause");
              }
              fread(&cadastro,sizeof(Cad),1,arquivoDados);
         }
         
         fclose(arquivoDados);
         
         if(!existe)
         {
              printf("Cliente nao cadastrado!\n");
              system("pause");
         }
    }
         
    
    void mtd_busca_codigoProd()
    {
         int codigo, indice=0;
         int max = 0;
         int count = 0;
         
         printf("Digite o codigo do produto: ");
         scanf("%d",&codigo);
         
         arquivoDados = fopen("arquivo.txt","r");
         
         rewind(arquivoDados);
         fread(&cadastro,sizeof(Cad),1,arquivoDados);
         while(feof(arquivoDados)==0)
         {
              max++;
              fread(&cadastro,sizeof(Cad),1,arquivoDados);
         }
         
         Cad Cadastro[max];
         
         count = 0;
         rewind(arquivoDados);
         fread(&cadastro,sizeof(Cad),1,arquivoDados);
         while(feof(arquivoDados)==0)
         {
              Cadastro[count] = cadastro;
              count++;
              fread(&cadastro,sizeof(Cad),1,arquivoDados);
         }
         
         fclose(arquivoDados);
         
         indice = pesqseq(Cadastro,codigo,count);
         
         if(indice>=0)
         {
               printf("\nCodigo.......................: %d",Cadastro[indice].codigoCliente);     
               printf("\nNome.........................: %s",Cadastro[indice].nome);
               printf("\nEndereco.....................: %s",Cadastro[indice].endereco);
               printf("\nTelefone.....................: %s",Cadastro[indice].telefone);
               printf("\nData de Nascimento...........: %d/%d/%d",Cadastro[indice].nascimentoDia, Cadastro[indice].nascimentoMes, Cadastro[indice].nascimentoAno);
               printf("\nProdutos que costuma comprar.: \n");
               printf("\tCodigo-Quantidade\n");   
               
         for(int i=0; i<maxProd; i++)
            { 
                 if(Cadastro[indice].cadProdutos.codigoProduto[i] == 0)
                        continue;
                 else
                 {
                       printf("\t%d", Cadastro[indice].cadProdutos.codigoProduto[i]);
                       printf("\t%d\n", Cadastro[indice].cadProdutos.quantidade[i]);
                       i++;
                 }
            }
            system("pause");
         }
         else
         {
            printf("Nenhum cliente compra este produto!\n");
            system("pause");
         }
    }
            
            
    void mtd_mostrar_ordenadoNome()
    {
        int i = 0;
        int count = 0;
        int count2;
        
        arquivoDados = fopen("arquivo.txt","r");
        
        rewind(arquivoDados);
        fread(&cadastro,sizeof(Cad),1,arquivoDados);
        while (feof(arquivoDados)==0) 
        {
              count++;
              fread(&cadastro,sizeof(Cad),1,arquivoDados);
        }
        
        Cad Cadastro[count];
        count2 = 0;
        
        rewind(arquivoDados);
        fread(&cadastro,sizeof(Cad),1,arquivoDados);
        while (feof(arquivoDados)==0) 
        {
              Cadastro[count2] = cadastro;
              count2++;
              fread(&cadastro,sizeof(Cad),1,arquivoDados);
        }
        
        
        fclose(arquivoDados);
        
        bsort(Cadastro, count);
        
        count2 = 0;
        while (count2 < count) 
        {
         printf("\nCodigo.......................: %d",Cadastro[count2].codigoCliente);     
         printf("\nNome.........................: %s",Cadastro[count2].nome);  //Colocar o índice na struct para poder mostrar dentro deste loop (Cadastro[count].nome)
         printf("\nEndereco.....................: %s",Cadastro[count2].endereco);
         printf("\nTelefone.....................: %s",Cadastro[count2].telefone);
         printf("\nData de Nascimento...........: %d/%d/%d",Cadastro[count2].nascimentoDia, Cadastro[count2].nascimentoMes, Cadastro[count2].nascimentoAno);
         printf("\nProdutos que costuma comprar.: \n");
         printf("\tCodigo-Quantidade\n");   
         i = 0;  
         while(i < maxProd)
         { 
                 if(Cadastro[count].cadProdutos.codigoProduto[i] == 0)
                        i++;
                 else
                 {
                       printf("\t%d", Cadastro[count2].cadProdutos.codigoProduto[i]);
                       printf("\t%d\n", Cadastro[count2].cadProdutos.quantidade[i]);
                       i++;
                 }
         }
         count2++;
         }
        
         system("pause");   
    }
    
    void mtd_mostrar_ordenadoCod()
    {
        int i = 0;
        int count = 0;
        int count2;
        
        arquivoDados = fopen("arquivo.txt","r");
        
        rewind(arquivoDados);
        fread(&cadastro,sizeof(Cad),1,arquivoDados);
        while (feof(arquivoDados)==0) 
        {
              count++;
              fread(&cadastro,sizeof(Cad),1,arquivoDados);
        }
        
        Cad Cadastro[count];
        count2 = 0;
        
        rewind(arquivoDados);
        fread(&cadastro,sizeof(Cad),1,arquivoDados);
        while (feof(arquivoDados)==0) 
        {
              Cadastro[count2] = cadastro;
              count2++;
              fread(&cadastro,sizeof(Cad),1,arquivoDados);
        }
        
        
        fclose(arquivoDados);
        
        ssort(Cadastro, count);
        
        count2 = 0;
        while (count2 < count) 
        {
         printf("\nCodigo.......................: %d",Cadastro[count2].codigoCliente);     
         printf("\nNome.........................: %s",Cadastro[count2].nome);  //Colocar o índice na struct para poder mostrar dentro deste loop (Cadastro[count].nome)
         printf("\nEndereco.....................: %s",Cadastro[count2].endereco);
         printf("\nTelefone.....................: %s",Cadastro[count2].telefone);
         printf("\nData de Nascimento...........: %d/%d/%d",Cadastro[count2].nascimentoDia, Cadastro[count2].nascimentoMes, Cadastro[count2].nascimentoAno);
         printf("\nProdutos que costuma comprar.: \n");
         printf("\tCodigo-Quantidade\n");   
         i = 0;  
         while(i < maxProd)
         { 
                 if(Cadastro[count].cadProdutos.codigoProduto[i] == 0)
                        i++;
                 else
                 {
                       printf("\t%d", Cadastro[count2].cadProdutos.codigoProduto[i]);
                       printf("\t%d\n", Cadastro[count2].cadProdutos.quantidade[i]);
                       i++;
                 }
         }
         count2++;
         }
        
         system("pause");   
    }
    
                                                   
                                                                                      
                     
    
    int main()
    {
        int op;
        
        mtd_CriarArquivo();
        
        do{
        system("cls");
        printf("1-Cadastrar Cliente\n");
        printf("2-Remover Cliente\n");
        printf("3-Remover produto do Cliente\n");
        printf("4-Busca pelo nome do Cliente\n");
        printf("5-Busca pelo codigo do Cliente\n");
        printf("6-Busca dos Clientes pelo codigo do produto\n");
        printf("7-Mostra pelo nome do Cliente\n");
        printf("8-Mostra pelo codigo do Cliente\n");
        printf("9-Sair\n");
        printf("Opcao: "); 
        
        scanf("%d",&op);
        
        switch(op)
        {
                  case 1: mtd_cadastrar();
                  break;
                  
                  case 2: mtd_removerCli();
                  break;
                  
                  case 3: mtd_removerProd();
                  break;
                  
                  case 4: mtd_busca_clienteNome();
                  break;
                  
                  case 5: mtd_busca_clienteCod();
                  break;
                  
                  case 6: mtd_busca_codigoProd();
                  break;
                  
                  case 7: mtd_mostrar_ordenadoNome();
                  break;
                  
                  case 8: mtd_mostrar_ordenadoCod();
                  break;
                  
                  default: printf("Opcao invalida!");
                  break;
        }
      }while(op != 9);
    }

    Comment


    • Font Size
      #3
      Postado Originalmente por gcaraciolo Ver Post
      ae galera, estou tentando aprender o assunto de arquivos em C, mais to achando muito complicado, e não há muitos tópicos da internet sobre esse assunto.
      minha duvida são nas funções de fread e fwrite.

      fazer copias de uma estrutura para outro de arquivos diferentes, fazer alterações em um arquivo, essas coisas..

      os tópicos que tem na internet são mais sobre fputc, fgetc.. que nao me interessa muito, porque quero gravar estruturas, e em arquivos binários!! se alguem puder da um help com algum codigo eu ficarei muito grato!! obrigado a todos!
      mano olha essa apostila aqui eu uso na facu e ela é boa, explica bem, e tem varias coisas e exemplos pa tu melhora xD
      Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... se ajudei da um like ai xD

      Comment


      • Font Size
        #4
        Na minha opinião pra quem esta começando agora, o ideal seria pelo menos começa com Programação pascal ele e mais fácil e simples de entende.
        Quando vc tiver já com uma noção de programação ai sim pula para o C+.

        Você verá que quando começa estuda o C+ já vai esta abito a algumas coisa e não terá tanta dúvidas assim futuramente.

        (essa dica serve muito para quem estuda pela internet )

        Comment

        X
        Working...
        X