Arquivos em C
Publicado por Ivan Rocha 21/07/2007
[ Hits: 11.318 ]
Homepage: http://homes.dcc.ufba.br/~ivan062/bahia
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.
/* 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);
   }
}
Organizador de filmes para o IMDB
Ajustando o sincronismo da legenda com o filme
Fwn - Formatador de arquivos .txt
Programa para inversão de colunas
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Problemas com Driver NVIDIA (5)
Warcraft II Remastered no Linux? (8)
Instalação dualboot Windows 11 e Debian 13 (7)









