Jump to content


Photo

Arquivo Em C - Registro


  • Faça o login para participar
1 reply to this topic

#1 ruymds

ruymds

    Novato no fórum

  • Usuários
  • 3 posts
  • Sexo:Masculino
  • Localidade:Brasil

Posted 09/07/2011, 13:51

Olá pessoal,

alguém poderia me dar uma dica do código abaixo. Quando executo e faço todo o preenchimento do registro e dai o arquivo é gravado com mais de 1,5Gb em txt. O programa trava e o o arquivo txt fica indisponivel pois não é possivel abrir tal arquivo por possuir mais de 1,5Gb.

O que esta de errado no código.


obrigado.

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>

void Clientes();

/* definicao do tipo cliente*/
typedef struct {
        int codcli;
        char nome[100];
        int cpf[11];
        char endereco[30];
        int telefone[10];
        int idade[2];
        int codcarro;
}cliente;


// Função de cadastro de clientes
void Clientes()
{
   system("cls");
   printf("--------------------------------------------------------------------------------\n");
   printf("                         Cadastro de Clientes\n");
   printf("--------------------------------------------------------------------------------\n");  
    
  
      cliente *vetclientes; // vetor de clientes
      int num;  // numero de clientes
      char op; // opção de cadastro
      FILE *arq_cliente; // arq. de armazenamento
   do{      
          // abre o arquivo para leitura
          arq_cliente=fopen("Cadastro_Cliente.txt","r+b");
          
          if(arq_cliente==NULL)
          {
             // se arquivo não existe abre para escrita              
             arq_cliente=fopen("Cadastro_Cliente.txt","w+b");
             // inicializa num de clientes com 0
             num=0;
          }else{
                 //se arquivo existe le o num de clientes  
                 fread(&num,sizeof(int),1,arq_cliente);
                 //aloca memória para os clientes
                 vetclientes = (cliente *)malloc(sizeof(cliente)*num);
                 // e le o vetor de clientes inteiro
                 fread(vetclientes,sizeof(cliente),num,arq_cliente);
          }
          
          if(num==0)
          {
             // se n=0, aloca memoria para vetor
             vetclientes = (cliente *)malloc(sizeof(cliente));
          }else{
                 // caso contrario realoca memoria para vetor
                 vetclientes = (cliente *)realloc(vetclientes,sizeof(cliente)*(num+1));
          }
  
       // cadastra novo cliente
          printf("\nCliente %d",vetclientes[num].codcli);
          //vetclientes[num].codcli = num;          
          printf("\nNome: "); scanf("%s",vetclientes[num].nome);
          fflush(stdin);
          printf("CPF: "); scanf("%i",vetclientes[num].cpf);
          fflush(stdin);
          printf("Endereco: "); scanf("%s",vetclientes[num].endereco);
          fflush(stdin);
          printf("Telefone: "); scanf("%i",vetclientes[num].telefone);
          fflush(stdin);
          printf("Idade: "); scanf("%i",&vetclientes[num].idade);
          printf("codigo:", &vetclientes[num].codcli);
          printf("\nRegistro gravado com sucesso!\n");
    
      // incrementa numero de clientes
         num++;
      
              // fecha o arquivo
              fclose(arq_cliente);
              
              // e em seguida reabre para posicionar no comeco
              arq_cliente=fopen("Cadastro_Cliente.txt","r+b");
              
              //reescreve o numero de clientes atualizado
              fwrite(&num,sizeof(int),1,arq_cliente);  
              fwrite(vetclientes,sizeof(cliente),num,arq_cliente);  
              
              // e fecha o arquivo
              fclose(arq_cliente);
              
              //libera memoria
              free(vetclientes);
              
      printf("\nDeseja registrar novo Cliente?[S/N]: ");
      scanf("%s",op);
  }while((op!='n') || (op!='N'));
}


#2 dddidan

dddidan

    Ativo

  • Usuários
  • 381 posts
  • Sexo:Masculino
  • Localidade:Taboão da Serra - SP

Posted 09/07/2011, 14:41

Faz tempo que não trabalho com C, mas tente dar uma olhada se ao inserir os dados, você não está inserindo varias vezes a mesma coisa. É um erro comum haha

Estou sem nenhum compilador de C aqui no pc, então não tenho como rodar o código. faça um debug com essa função que irá retornar o tamanho do arquivo:
int tamanho(char *arquivo){
FILE *arq;
int total =0;

arq = fopen(arq,"r");//abre arquivo no modo de leitura
fseek(arq,0,SEEK_END);//vai até o final do arquivo
total = tell(arq);//retorna quantos bytes foram contados
fclose(arq);//fecha arquivo
return(total);//retorna o valor total
}

Eu digitei ela meio que de cabeça, se necessário, faça suas alterações... E no séu código, faça algo assim:
....

printf("\nCliente %d",vetclientes[num].codcli);
//vetclientes[num].codcli = num;          
printf("\nNome: "); scanf("%s",vetclientes[num].nome);
fflush(stdin);
printf(tamanho("Cadastro_Cliente.txt"));
printf("CPF: "); scanf("%i",vetclientes[num].cpf);
fflush(stdin);
printf(tamanho("Cadastro_Cliente.txt"));
printf("Endereco: "); scanf("%s",vetclientes[num].endereco);
fflush(stdin);
printf(tamanho("Cadastro_Cliente.txt"));
printf("Telefone: "); scanf("%i",vetclientes[num].telefone);
fflush(stdin);
printf(tamanho("Cadastro_Cliente.txt"));
printf("Idade: "); scanf("%i",&vetclientes[num].idade);
printf("codigo:", &vetclientes[num].codcli);
printf("\nRegistro gravado com sucesso!\n");
printf(tamanho("Cadastro_Cliente.txt"));

....

com isso, vc vai saber quanto esta sendo gravado e pode ajudar a saber onde esta o problema...
Mais vale um Dev C++ na mão do que dois codeblocks voando

PHP - ||||||||||||||| MySql - |||||||||||||||
C/C++ - ||||||||||||||| Oracle - |||||||||||||||
PERL - |||||||||||||||




0 user(s) are reading this topic

0 membro(s), 0 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq