Arquivos em C

Publicado por Ivan Rocha 21/07/2007

[ Hits: 11.082 ]

Homepage: http://homes.dcc.ufba.br/~ivan062/bahia

Download Arquivos




Manipulação de Arquivos de acesso sequencial em C, como um cadastro de funcionários, com as funções de cadastro, remoção lógica, listagem e consulta.

  



Esconder código-fonte

/* Ivan Carmo da Rocha Neto
   ivan.cr.neto@gmail.com */


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

typedef struct registro{
   char nome[20];
   int num, flag;
   float salario;
}funcionario;



/*FUNCAO PRA A LIMPEZA DO BUFFER DO TECLADO*/

void flush_in()
{
   int ch;
   while( (ch = fgetc(stdin)) != EOF && ch != '\n' ){}
}



/*FUNCAO CADASTRAR FUNCIONARIO*/

void cadastrar(FILE *arquivo){
   funcionario func, aux;
   
   if((arquivo = fopen("arqexemplo.txt", "r+")) == NULL){
      printf("Erro na Database do Sistema! \nContate o Administrador!\n");
      usleep(500000);
      system("clear");
      exit(0);
   }
   printf("\nNome: ");
   scanf("%s", func.nome);
   flush_in();
   printf("Codigo: ");
   scanf("%d", &func.num);
   printf("Salario: ");
   scanf("%f", &func.salario);
   fseek(arquivo, 0, SEEK_SET);
   while(!feof(arquivo) && (aux.flag != 0)){
      fread(&aux, sizeof(funcionario), 1, arquivo);
      if((aux.num == func.num) && (aux.flag == 1)){
         aux.num = -1;
         break;
      }
   }
   if(aux.num == -1){
      printf("\nCodigo existente! Cadastre Novamente! \n");
      getchar();
   }else{
      if(aux.flag == 0){
         fseek(arquivo, -sizeof(funcionario), SEEK_CUR);
      }else{
         fseek(arquivo, 0, SEEK_END);
      }
      func.flag = 1;
      fwrite(&func, sizeof(funcionario), 1, arquivo);
   }
   fclose(arquivo);
}



/*FUNCAO REMOVER FUNCIONARIO*/

void remover(FILE *arquivo){
   funcionario func;
   int numero, achou;
   char op[1];
   
   if((arquivo = fopen("arqexemplo.txt", "r+")) == NULL){
      printf("Erro na Database do Sistema! \nContate o Administrador!\n");
      usleep(500000);
      system("clear");
      exit(0);
   }
   printf("\nNumero: ");
   scanf("%d", &numero);
   fseek(arquivo, 0, SEEK_SET);
   achou = 0;
   while((!feof(arquivo)) && (!achou)){
      fread(&func, sizeof(funcionario), 1, arquivo);
      if((numero == func.num) && (func.flag == 1))
         achou = 1;
   }
   if(achou == 1){
      printf("\n|Funcionario|\n\n");
      printf("Nome: %s\n", func.nome);
      printf("Codigo: %d\n", func.num);
      printf("Salario: %.2f\n\n", func.salario);
      printf("Remover Funcionario? (S/N): ");
      scanf("%s", op);
      //flush_in();
      if(toupper(op[0]) == 'S'){
         func.flag = 0;
         fseek(arquivo, -sizeof(funcionario), SEEK_CUR);
         fwrite(&func, sizeof(funcionario), 1, arquivo);
      }
   }
   fclose(arquivo);
}



/*FUNCAO CONSULTAR FUNCIONARIO*/

void consultar(FILE *arquivo){
   funcionario func;
   int numero, achou;
   
   if((arquivo = fopen("arqexemplo.txt", "a+")) == NULL){
      printf("Erro na Database do Sistema! \nContate o Administrador!\n");
      usleep(500000);
      system("clear");
      exit(0);
   }
   printf("\nNumero: ");
   scanf("%d", &numero);
   //rewind(arquivo);
   fseek(arquivo, 0, SEEK_SET);
   achou = 0;
   while((!feof(arquivo)) && (!achou)){
      fread(&func, sizeof(funcionario), 1, arquivo);
      if((func.num == numero) && (func.flag == 1)){
         printf("\n|Funcionario|\n\n");
         printf("Nome: %s\n", func.nome);
         printf("Codigo: %d\n", func.num);
         printf("Salario: %.2f\n", func.salario);
         achou = 1;
         getchar();
      }
   }
   if(!achou){
      printf("\nFuncionario não encontado! \n");
      getchar();
   }
   getchar();
   fclose(arquivo);
}


/*FUNCAO LISTAR FUNCIONARIOS CADASTRADOS*/

void listar(FILE *arquivo){
   funcionario func;
   long tamanho;
   int achou;
   
   if((arquivo = fopen("arqexemplo.txt", "a+")) == NULL){
      printf("Erro na Database do Sistema! \nContate o Administrador!\n");
      usleep(500000);
      system("clear");
      exit(0);
   }
   fseek(arquivo, 0, SEEK_END);
   tamanho = ftell(arquivo);
   fseek(arquivo, 0, SEEK_SET);
   achou = 0;
   while(ftell(arquivo) != tamanho){
      fread(&func, sizeof(funcionario), 1, arquivo);
      if(func.flag == 1){
         printf("\n|Funcionario|\n\n");
         printf("Nome: %s\n", func.nome);
         printf("Codigo: %d\n", func.num);
         printf("Salario: %.2f\n\n", func.salario);
         achou = 1;
      }
   }
   if(!achou){
      printf("\nNao ha funcionarios cadastrados!\n");
   }
   getchar();
   fclose(arquivo);
}


/*FUNCAO PRINCIPAL*/

main(){
   char op[1];
   FILE *arquivo;
   
   for(;;){
      system("clear");
      printf("===== PROGRAMA TESTE ARQUIVOS EM C =====\n\n");
      printf("Sequencia de Operacoes:\n\n");
      printf("a. Cadastra; \n");
      printf("b. Remove; \n");
      printf("c. Consulta;\n");
      printf("d. Listar; \n");
      printf("s. SAIR.\n\n");
      printf("OPCAO: ");
      scanf("%s", op);
      flush_in();
      switch(toupper(op[0])){
         case 'A':{
            cadastrar(arquivo);
         }break;
         case 'B':{
            remover(arquivo);
         }break;
         case 'C':{
            consultar(arquivo);
         }break;
         case 'D':{
            listar(arquivo);
         }break;
         case 'S':{
            printf("\nTem certeza? (S/N): ");
            scanf("%s", op);
            flush_in();
            if (toupper(op[0]) == 'S'){
               system("clear");
               exit(0);
            }
         }break;
      }
   //fclose(arquivo);
   }
}

Scripts recomendados

Faça um programa em c++ gere um arquivo e depois leia usando um gerador de numeros do tipo s

Leitura de arquivo texto separando as colunas

Super Truco

Manipulando o arquivo mtab

read_pg_conf


  

Comentários
[1] Comentário enviado por ivan.cr.neto em 21/07/2007 - 15:01h

Galera, coloquem isso antes do for(;;) lá na main() se não dá erro!!! Vlws!

if((arquivo = fopen("arqexemplo.txt", "a+")) == NULL){
printf("Erro na Database do Sistema! \nContate o Administrador!\n");
usleep(500000);
system("clear");
exit(0);
}
fclose(arquivo);


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts