Jump to content
Fórum Script Brasil
  • 0

Apenas um Erro, Alguém saberia dizer?


keytous
 Share

Question

Boa tarde Pessoal

Estou com meu código praticamente pronto mas esta acontecendo apenas um erro q não consigo identificar, corrigir. Quando excluo algum registro e depois vou cadastrar outro novamente sem fechar o programa o cadastro duplica quando mando listar novamente. Alguém poderia me ajudar? Acredito q seja apenas um detalhe mas não o encontro. OBRIGADO !!
----------------------
# include <stdio.h>
struct dados{
int cod;
char nome[30];
float salario;
char setor[30];
char funcao[30];
};
struct dados cadastro[100];
int main ();
int cadastrar (){
int cont = 0, i = 0;
char soun;
FILE *arquivo;
arquivo = fopen("dados.txt", "r+");
if (arquivo == NULL){
printf ("ERRO !! Banco não existe, criando novo Banco de Dados..."); fflush(stdin); getchar ();
arquivo = fopen("dados.txt", "w+");
} else {
printf ("Banco de Dados Carregado com Sucesso !!");
while (!feof(arquivo)){ // enquando não(!) chegar no final do arquivo
fread(&cadastro, sizeof(struct dados), 1, arquivo);
if (!feof(arquivo)){ // condicão caso não chegue no final, ou seja tem arquivos
cont = cadastro.cod + 1;
i++;
}
}
}
do{
cadastro[cont].cod = cont;
printf("\nCodigo: %d", cadastro[cont].cod); getchar ();
printf("\nNome: "); fgets (cadastro[cont].nome, 30, stdin);
printf("\nSalario: "); scanf ("%f", &cadastro[cont].salario); getchar();
printf("\nSetor de Trabalho: "); gets (cadastro[cont].setor);
printf("\nFuncao: "); gets (cadastro[cont].funcao);
printf ("\nLentra (n) para novo cadastro, ou qualquer outra para sair: ");
scanf ("%c", &soun);
cont++; getchar ();
if (cont >= 100){
printf ("Esgotado limite de cadastro !!");
soun = 'a';
}
}while (soun == 'n');
arquivo = fopen("dados.txt", "w");
for(i=0; i < cont; i++){
fwrite(&cadastro, sizeof(struct dados), 1, arquivo);
}
fclose(arquivo);
main ();
}
int listar (){
int i, cont = 0;
FILE *arquivo;
arquivo = fopen("dados.txt", "r");
while (!feof(arquivo)){
fread(&cadastro[cont], sizeof(struct dados), 1, arquivo);
if (!feof(arquivo)){
cont++;
}
}
fclose(arquivo);
for(i=0; i < cont; i++){
printf("\nCodigo: %d", cadastro.cod);
printf("\nNome: %s",cadastro.nome);
printf("Salario: %5.2f\n",cadastro.salario);
printf("Setor: %s\n",cadastro.setor);
printf("Funcao: %s\n",cadastro.funcao);
}
main ();
}
int media (){
int cont = 0;
float salario = 0, mediasalario = 0;
FILE *arquivo;
arquivo = fopen("dados.txt", "r");
while (!feof(arquivo)){
fread(&cadastro[cont], sizeof(struct dados), 1, arquivo);
if (!feof(arquivo)){
salario = salario + cadastro[cont].salario;
cont++;
}
}
mediasalario = salario / cont;
printf ("\nAtualmente existe %d funcionarios contratados", cont);
printf ("\nA Media geral de Salario é: %5.2f por Funcionario Registrado\n\n", mediasalario);
main ();
}
int pesquisa (){
int cont = 0, codigo, aux = 2;
printf ("Digite o codigo do Funcionario: ");
scanf ("%d", &codigo);
printf ("\nPesquisando no Banco de Dados...");
FILE *arquivo;
arquivo = fopen("dados.txt", "r");
while (!feof(arquivo)){
fread(&cadastro[cont], sizeof(struct dados), 1, arquivo);
if (!feof(arquivo)){
if (codigo == cadastro[cont].cod){
aux = 1;
printf ("\n\n\nCadastro Encontrado !!");
printf("\nCodigo: %d", cadastro[cont].cod);
printf("\nNome: %s",cadastro[cont].nome);
printf("Salario: %5.2f\n",cadastro[cont].salario);
printf("Setor: %s\n",cadastro[cont].setor);
printf("Funcao: %s\n\n\n",cadastro[cont].funcao);
}
cont++;
}
}
if (aux == 2){
printf ("\nCadastro não Encontrado !!\n\n");
}
main ();
}
int excluir (){
int i = 0, cont = 0, codigo;
printf ("Digite o codigo do Funcionario: ");
scanf ("%d", &codigo);
FILE *arquivo;
arquivo = fopen("dados.txt", "r+");
while (!feof(arquivo)){
fread(&cadastro, sizeof(struct dados), 1, arquivo);
if (!feof(arquivo)){
cont = cadastro.cod + 1;
i++;
}
}
arquivo = fopen("dados.txt", "w");
for(i=0; i < cont; i++){
if (cadastro.cod != codigo){
fwrite(&cadastro, sizeof(struct dados), 1, arquivo);
}
}
fclose(arquivo);
main ();
}
int main (){
int op;
printf ("\nEscolha uma opcao\n");
printf ("\n(1) - Para Cadastrar");
printf ("\n(2) - Para Listar");
printf ("\n(3) - Media de Salario dos funcionarios");
printf ("\n(4) - Pesquisar Funcionario pelo Codigo de Cadastro");
printf ("\n(5) - Excluir arquivo");
printf ("\n(0) - Sair \n\n>> ");
scanf ("%d", &op);
if (op == 1){
cadastrar ();
}
if (op == 2){
listar ();
}
if (op == 3){
media ();
}
if (op == 4){
pesquisa ();
}
if (op == 5){
excluir ();
}
if (op == 0){
return 0;
}
}
---------------------------------------
Link to comment
Share on other sites

16 answers to this question

Recommended Posts

  • 0
# include <stdio.h>
#include <stdlib.h>

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

struct dados{
int cod;
    char nome[30];
float salario;
char setor[30];
char funcao[30];
};
struct dados cadastro[100];
 
int main ();
 
void cadastrar (){
 
int cont = 0, i = 0;
char soun;
 
FILE *arquivo;
    arquivo = fopen("dados.txt", "r+");
    if (arquivo == NULL){
     printf ("ERRO !! Banco não existe, criando novo Banco de Dados..."); flush_in(); getchar ();  //fflush(stdin) é para limpar buffer de saída e não de entrada esta é a melhor forma de limpar o buffer
     arquivo = fopen("dados.txt", "w+");
 
    } else {
     printf ("Banco de Dados Carregado com Sucesso !!");
     while (!feof(arquivo)){ // enquando não(!) chegar no final do arquivo
     fread(&cadastro[i], sizeof(struct dados), 1, arquivo);
    
     if (!feof(arquivo)){ // condicão caso não chegue no final, ou seja tem arquivos
     cont = cadastro[i].cod + 1;
     i++;
    
     }
}
    }
   
     do{
cadastro[cont].cod = cont;
      printf("\nCodigo: %d", cadastro[cont].cod); getchar ();
      printf("\nNome: "); fgets (cadastro[cont].nome, 30, stdin);
      printf("\nSalario: "); scanf ("%f", &cadastro[cont].salario); getchar();
      printf("\nSetor de Trabalho: "); gets (cadastro[cont].setor);
      printf("\nFuncao: "); gets (cadastro[cont].funcao);
 
      printf ("\nLentra (n) para novo cadastro, ou qualquer outra para sair: ");
      scanf ("%c", &soun);
      cont++; getchar ();
 
       if (cont >= 100){
       printf ("Esgotado limite de cadastro !!");
           
}
     }while (soun == 'n');
    
     arquivo = fopen("dados.txt", "w");
     for(i=0; i < cont; i++){
     fwrite(&cadastro[i], sizeof(struct dados), 1, arquivo);
     }
     fclose(arquivo);
    
     main ();
}
 
void listar (){
int i, cont = 0;
 
FILE *arquivo;
  arquivo = fopen("dados.txt", "r");
 
while (!feof(arquivo)){
fread(&cadastro[cont], sizeof(struct dados), 1, arquivo);
 
if (!feof(arquivo)){
     cont++;
}
}
fclose(arquivo);
    
         for(i=0; i < cont; i++){
         printf("\nCodigo: %d", cadastro[i].cod);
         printf("\nNome: %s",cadastro[i].nome);
         printf("Salario: %5.2f\n",cadastro[i].salario);
         printf("Setor: %s\n",cadastro[i].setor);
         printf("Funcao: %s\n",cadastro[i].funcao);
         system("pause>>NULL"); 
     }
     main ();
   
}
 
void media (){
int cont = 0;
float salario = 0, mediasalario = 0;
 
FILE *arquivo;
  arquivo = fopen("dados.txt", "r");
 
  while (!feof(arquivo)){
fread(&cadastro[cont], sizeof(struct dados), 1, arquivo);
 
if (!feof(arquivo)){
     salario = salario + cadastro[cont].salario;
     cont++;
}
}
mediasalario = salario / cont;
printf ("\nAtualmente existe %d funcionarios contratados", cont);
printf ("\nA Media geral de Salario é: %5.2f por Funcionario Registrado\n\n", mediasalario);
 
main ();
}
 
void pesquisa (){
int cont = 0, codigo, aux = 2;
 
printf ("Digite o codigo do Funcionario: ");
scanf ("%d", &codigo);
printf ("\nPesquisando no Banco de Dados...");
 
FILE *arquivo;
  arquivo = fopen("dados.txt", "r");
 
  while (!feof(arquivo)){
fread(&cadastro[cont], sizeof(struct dados), 1, arquivo);
 
if (!feof(arquivo)){
if (codigo == cadastro[cont].cod){
aux = 1;
printf ("\n\n\nCadastro Encontrado !!");
printf("\nCodigo: %d", cadastro[cont].cod);
         printf("\nNome: %s",cadastro[cont].nome);
         printf("Salario: %5.2f\n",cadastro[cont].salario);
         printf("Setor: %s\n",cadastro[cont].setor);
         printf("Funcao: %s\n\n\n",cadastro[cont].funcao);
} 
cont++;
} 
}
if (aux == 2){
printf ("\nCadastro não Encontrado !!\n\n");
}
main ();

}
 
void excluir (){
 
int i = 0, cont = 0, codigo;
 
printf ("Digite o codigo do Funcionario: ");
scanf ("%d", &codigo);
 
FILE *arquivo;
    arquivo = fopen("dados.txt", "r+");
 
while (!feof(arquivo)){
     fread(&cadastro[i], sizeof(struct dados), 1, arquivo);
    
     if (!feof(arquivo)){
     cont = cadastro[i].cod + 1;
     i++;
    
     }
}
 
     arquivo = fopen("dados.txt", "w");
     for(i=0; i < cont; i++){
     if (cadastro[i].cod != codigo){
     fwrite(&cadastro[i], sizeof(struct dados), 1, arquivo);
     }
     }
     fclose(arquivo);
    
     main ();
}
 
int main (){
int op;
	   system("cls");
printf ("\nEscolha uma opcao\n");
printf ("\n(1) - Para Cadastrar");
printf ("\n(2) - Para Listar");
printf ("\n(3) - Media de Salario dos funcionarios");
printf ("\n(4) - Pesquisar Funcionario pelo Codigo de Cadastro");
printf ("\n(5) - Excluir arquivo");
printf ("\n(0) - Sair \n\n>> ");
scanf ("%d", &op);
 
if (op == 1){
cadastrar ();
}
if (op == 2){
listar ();
}
if (op == 3){
media ();
}
if (op == 4){
pesquisa ();
}
if (op == 5){
excluir ();
}
if (op == 0){
return 0;
}
}

Tenta desta forma Att, Barão.

Link to comment
Share on other sites

  • 0

Bom dia Amigo Barao, poxa OBRIGADO !! Achei q ninguém iria me ajudar.... Mas infelizmente com suas modificações esta acontecendo o mesmo erro q acontece para mim. Faz assim, executa o programa, ai depois você adiciona 3 funcionários, lista eles vai estar ok. Depois você exclui o segundo, ai você faz um novo cadastro, apos o novo cadastro lista de novo, vai aparecer 4 registro com dois duplicados..... Eu já fiz de tudo até onde eu sabia e não sabia, para resolver, e nada !!!

MUITO OBRIGADO!!

Link to comment
Share on other sites

  • 0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct dados{
int cod;
char nome[30];
float salario;
char setor[30];
char funcao[30];
};
struct dados cadastro[100];
 

void cadastrar (){
 
int cont = 0, i = 0;
char soun;
 
FILE *arquivo;
    arquivo = fopen("dados.txt", "r");
    if (arquivo == NULL){
     printf ("\nERRO !! Banco não existe, criando novo Banco de Dados..."); fflush(stdin); getchar ();
     arquivo = fopen("dados.txt", "a");
 
    } else {
     printf ("\n\nBanco de Dados Carregado com Sucesso !!");
     while (!feof(arquivo)){ // enquando não(!) chegar no final do arquivo
     fread(&cadastro[i], sizeof(struct dados), 1, arquivo);
    
     if (!feof(arquivo)){ // condicão caso não chegue no final, ou seja tem arquivos
     cont = cadastro[i].cod + 1;
     i++;
    
     }
}
    }
   
     do{
      cadastro[cont].cod = cont;
      printf("\nCodigo: %d", cadastro[cont].cod); getchar ();
      printf("\nNome: "); fgets (cadastro[cont].nome, 30, stdin);
      printf("\nSalario: "); scanf ("%f", &cadastro[cont].salario); getchar();
      printf("\nSetor de Trabalho: "); gets (cadastro[cont].setor);
      printf("\nFuncao: "); gets (cadastro[cont].funcao);
	  printf ("\nLentra (n) para novo cadastro, ou qualquer outra para sair: ");
      scanf ("%c", &soun);
      cont++; getchar ();
 
if (cont >= 100){
printf ("Esgotado limite de cadastro !!");
soun = 'a';     
}
     }while (soun == 'n');
    
     arquivo = fopen("dados.txt", "w");
     for(i=0; i < cont; i++){
     fwrite(&cadastro[i], sizeof(struct dados), 1, arquivo);
     }
     fclose(arquivo);
    
   
}
 
void listar (){
int i, cont = 0;
 
FILE *arquivo;
  arquivo = fopen("dados.txt", "rt");
   if (arquivo == NULL){
                printf ("\nERRO !! Banco não existe, criando novo Banco de Dados..."); fflush(stdin); getchar ();
                arquivo = fopen("dados.txt", "w+");
				}
				
 
 
while (!feof(arquivo)){
fread(&cadastro[cont], sizeof(struct dados), 1, arquivo);
 
if (!feof(arquivo)){
     cont++;
}
}
fclose(arquivo);
    
      for(i=0; i < cont; i++){
         printf("\n\nCodigo: %d\n\n", cadastro[i].cod);
         printf("Nome: %s\n",cadastro[i].nome);
         printf("Salario: %5.2f\n\n",cadastro[i].salario);
         printf("Setor: %s\n\n",cadastro[i].setor);
         printf("Funcao: %s\n\n",cadastro[i].funcao);
         
         system("pause>>NULL");
     }
  
       
}
 
void media (){
int cont = 0;
float salario = 0, mediasalario = 0;
 
FILE *arquivo;
  arquivo = fopen("dados.txt", "r");
 
  while (!feof(arquivo)){
fread(&cadastro[cont], sizeof(struct dados), 1, arquivo);
 
if (!feof(arquivo)){
     salario = salario + cadastro[cont].salario;
     cont++;
}
}
mediasalario = salario / cont;
printf ("\n\nAtualmente existe %d funcionarios contratados", cont);
printf ("\n\nA Media geral de Salario é: %5.2f por Funcionario Registrado\n\n", mediasalario);
 
 system("pause>>NULL"); 
}
 
void pesquisa (){
int cont = 0, codigo, aux = 2; 
 
printf ("Digite o codigo do Funcionario: ");
scanf ("%d", &codigo);
printf ("\n\nPesquisando no Banco de Dados...");
 
FILE *arquivo;
  arquivo = fopen("dados.txt", "r");
 
  while (!feof(arquivo)){
fread(&cadastro[cont], sizeof(struct dados), 1, arquivo);
 
if (!feof(arquivo)){
if (codigo == cadastro[cont].cod){
aux = 1;
printf ("\n\n\nCadastro Encontrado !!");
printf("\nCodigo: %d", cadastro[cont].cod);
         printf("\nNome: %s",cadastro[cont].nome);
         printf("Salario: %5.2f\n",cadastro[cont].salario);
         printf("Setor: %s\n",cadastro[cont].setor);
         printf("Funcao: %s\n\n\n",cadastro[cont].funcao);
} 
cont++;
} 
}
if (aux == 2){
printf ("\n\nCadastro não Encontrado !!\n\n");
}


}
 
void excluir (){
 
int i = 0, cont = 0, codigo;
 
printf ("\n\nDigite o codigo do Funcionario: ");
scanf ("%d", &codigo);
 
FILE *arquivo;
    arquivo = fopen("dados.txt", "r+");
 
while (!feof(arquivo)){
     fread(&cadastro[i], sizeof(struct dados), 1, arquivo);
    
     if (!feof(arquivo)){
     cont = cadastro[i].cod + 1;
     i++;
    
     }
}
 
     arquivo = fopen("dados.txt", "w");
     for(i=0; i < cont; i++){
     if (cadastro[i].cod != codigo){
     fwrite(&cadastro[i], sizeof(struct dados), 1, arquivo);
     }
     }
     
     fclose(arquivo);
	
}


int main(int argc, char *argv[])
{
	

  denovo:

 int opcao;
    
    do{
        system("cls");
printf ("\nEscolha uma das opcao abaixo\n");
printf ("\n(1) - Para Cadastrar");
printf ("\n(2) - Para Listar");
printf ("\n(3) - Media de Salario dos funcionarios");
printf ("\n(4) - Pesquisar Funcionario pelo Codigo de Cadastro");
printf ("\n(5) - Excluir funcionário");
printf ("\n(0) - Sair \n\n");

        printf("\nDigite uma opcao>>  ");
        scanf("%d", &opcao);
        
       
     
		
        system("cls");

        switch(opcao){
            case 1:
              cadastrar ();  
                break;
            case 2:
                listar ();                 
                break;
            case 3:
                media ();
                break;
			case 4:
			pesquisa ();
			system("pause");
                break;		
			case 5: 			
			excluir ();
			goto denovo;		
                break;		
			case 0:									
				exit(0);
            default:
                printf("\n\nOpcao invalida! Tente Novamente!\n\n");
                system("pause");

        }
    }while(opcao!=5);
    
    return 0; 

	}

Tenta este código testei inúmeras vezes e obtive sucesso em todas

Edited by Barao
Link to comment
Share on other sites

  • 0

Olá!

Olha testei o seu codigo aqui da forma que você especificou e realmente o erro ocorre!

Bom ainda não tive tempo de estudar o seu codigo a fundo, e mesmo que tivesse acho que não vou ser muito util uma vez que sou iniciante.

Acho que não haveria problemas neste codigo mas tente utilizar algum codigo de formatação na função scanf(), para limpar o buffer de entrada do teclado, ou mesmo usar uma funcao ao final de cada scanf() que o faça, no meu caso uso linux " __fpurge(stdin);"

Com relação ao main() no fim de cada uma de suas funções, aqui apresentou erros no final de execução do programa, acredito que o problema seja pela chamada da função main(), que você o fez para retornar ao menu de opções, neste caso criei uma função chamada menu() especificamente para essa tarefa, eliminando o erro no codigo de retorno no final de execução do programa . . .

Por hora é só . . . vou testar mas não acho que vou ser muito mais util do que isso ! ! !

Ubuntu 14.04 GNU GCC 4.8 Codeblocks 13.12

Espero ter Ajudado !

Link to comment
Share on other sites

  • 0

Esse código tem vários erros, começando pelo erro que comenta Gender, sobre como limpar o buffer corretamente, até mesmo a forma de abrir os arquivos sem fazer uso da função perror para controlar as excepções ou erros que podem aparecer durante a abertura do arquivo, passando também por erros de reaproveitar o mesmo ponteiro 'arquivo' para abrir un novo documento, sem ter fechado previamente o arquivo anterior usando fclose(arquivo), isso faz con que não surta mudanças no arquivo que é quando fechamos o arquivo que são aplicadas. Esse erro esta na linha arquivo = fopen ( "dados.txt", "w" ); logo após a linha } while ( soun == 'n' ); dentro da função cadastrar. Em nenhum momento você fechou o file descriptor antes de reaproveitar o ele.

A coisa não termina ai... Outro erro grave é você tentar enviar a estrutura completa ao arquivo, quando na realidade deveria enviar os dados serializados, um a um, ao arquivo, caso contrario o alinhamento dos Bytes te vai dar uma dor de cabeça muito grande. Busque informação sobre Byte Aligne o alinhamento dos Bytes em C/C++. Busque também "space padding"

Faz pouco eu escrevi algo sobre isso aqui mesmo nesse foro, más como a todos não interessa ler coisas dos outros usuários sempre van chocar com o problema para depois buscar solução. Leia aqui sobre o problema:

https://www.scriptbrasil.com.br/forum/topic/179264-ajuda-com-programa-de-agenda-em-c/

Em fim... Esse código é uma boa coleção de bugs, provavelmente devido a que realmente alguns temas são bastante avançados, ou o professor não ta sabendo explicar nada direito. Sem falar dessas chamadas a main que você faz durante todo seu código.

Sinto ser duro, más é que você nem pois o código direito no foro, use a etiqueta code para dar formato ao código. Si não como eu te vou dizer em que linhas você esta errando? Mesmo assim você esta errando em tudo, precisaria mil linhas para ti explicar tudo isso direito, e ainda o fato de publicar o código sem as etiquetas não ajuda.

Coisas como informação do sistema operativo, arquitetura, compilador, IDE, etc, não são opções, são dados importantes na hora de acelerar a ajuda nos foros.

Se você quiser marcar um dia por skype posso te ajudar a reformular seu projeto de forma correta, más depende de vc. Em skype eu me chamo igual.

Sorte.

Link to comment
Share on other sites

  • 0

Boa noite vangodp.

Sabe q quando estava desenvolvendo o código do trabalho eu sabia q deveria ter bastante erros, mesmo sem ter certeza disso eu sabia. Eu faço Faculdade de Sistemas, sou um cara meio fechado assim, e como sou iniciante isso me prejudica bastante pois não tenho ninguém que poço contar... Me ajudar... Tudo q consegui até aqui foi com meu esforço, sozinho. Quando você fala "ou o professor não ta sabendo explicar nada direito" me fez lembrar q esses dias estava pensando em trocar de faculdade, porque já estou cansado dos professores dar trabalhos para os alunos sem passar o conteúdo. Na verdade o professor não explicou nada. Para você ter uma noção na ultima aula q tivemos ele tinha apenas MOSTRADO um código simples de umas 10 linhas sobre ponteiros, e nos passou uns dois exercícios sobre isso, mas o básico do básico, abrir arquivos, fechar escrever em arquivos NADA !!! Funções muito pouco, apenas exercícios básicos muito básicos. Neste mesmo semestre eu cancelei uma cadeira, pois bem no inicio o professor pediu um baita trabalho sobre um assunto q eu não sabia nem por onde começar. É como se alguém for te ensinar a ler mostrando apenas as vogais... Bom voltando ao código, realente o que você falou faz muito sentido, pois o arquivo fica todo desconfigurado quando eu excluo algum cadastro. Até acho q avancei bastante, pois em modo geral a unica coisa q esta dando problema diante de todos erros e bugs é para excluir. O restante esta ok. Mas vou dar uma olhada em tudo q você falou, e muito obrigado por ajudar, apenas pelo simples fato de você ter respondido é porque se importou de alguma forma. É bom saber q ainda existe pessoas boas dispostas a ajudar os outros. Admirável. Obrigado de verdade, e desculpa ai meu desabafo....

Link to comment
Share on other sites

  • 0
# include <stdio.h>
//# include <cstdio>

struct dados{
	int cod;
    char nome[30];
	float salario;
	char setor[30];
	char funcao[30];	
};
struct dados cadastro[100];

int main ();

void cadastrar (){
	
	int cont = 0, i = 0;
	char soun;
	
	FILE *arquivo;
    arquivo = fopen("dados.txt", "r+");
    if (arquivo == NULL){
    	printf ("ERRO !! Banco nao existe, criando novo Banco de Dados..."); getchar ();
    	arquivo = fopen("dados.txt", "w+");	
		
    } else {
    	printf ("Banco de Dados Carregado com Sucesso !!");
    	while (!feof(arquivo)){				// enquando não(!) chegar no final do arquivo
    		fread(&cadastro[i], sizeof(struct dados), 1, arquivo);
    	
    		if (!feof(arquivo)){			// condicão caso não chegue no final, ou seja tem arquivos
    			cont = cadastro[i].cod + 1;
    			i++;					
    	}
		}
    }
   
     do{
		cadastro[cont].cod = cont;
     	printf("\nCodigo: %d", cadastro[cont].cod);	getchar ();
     	printf("\nNome: "); fgets (cadastro[cont].nome, 30, stdin);
        printf("\nSalario: "); scanf ("%f", &cadastro[cont].salario);	getchar();
		printf("\nSetor de Trabalho: "); gets (cadastro[cont].setor);
		printf("\nFuncao: "); gets (cadastro[cont].funcao);
		
        printf ("\nLetra (n) para novo cadastro, ou qualquer outra para sair: ");
		scanf ("%c", &soun);								
		cont++;	getchar ();
		
		if (cont >= 100){																
			printf ("Esgotado limite de cadastro !!");
			soun = 'a';				    
		}	
     }while (soun == 'n');
    
    			arquivo = fopen("dados.txt", "w");
    			for(i=0; i < cont; i++){
    				fwrite(&cadastro[i], sizeof(struct dados), 1, arquivo);
    			}
    			fclose(arquivo);
    			
    			main ();
}
	
void listar (){
		int i, cont = 0;
	
		FILE *arquivo;
	 	arquivo = fopen("dados.txt", "r");
		
		while (!feof(arquivo)){
			fread(&cadastro[cont], sizeof(struct dados), 1, arquivo);
			
			if (!feof(arquivo)){							
    			cont++;
			}
		}
		fclose(arquivo);
    
     	for(i=0; i < cont; i++){
     		printf("\nCodigo: %d", cadastro[i].cod);
        	printf("\nNome: %s",cadastro[i].nome);
        	printf("Salario: %5.2f\n",cadastro[i].salario);
        	printf("Setor: %s\n",cadastro[i].setor);
        	printf("Funcao: %s\n",cadastro[i].funcao);
    	}
    	main ();
}	

void media (){
		int cont = 0;
		float salario = 0, mediasalario = 0;
	
		FILE *arquivo;
	 	arquivo = fopen("dados.txt", "r");
	 	
	 	while (!feof(arquivo)){
			fread(&cadastro[cont], sizeof(struct dados), 1, arquivo);
			
			if (!feof(arquivo)){						
    			salario = salario + cadastro[cont].salario;
    			cont++;
			}	
		}
		mediasalario = salario / cont;
		printf ("\nAtualmente existe %d funcionarios contratados", cont);
		printf ("\nA Media geral de Salario eh: %5.2f por Funcionario Registrado\n\n", mediasalario);
		
		main ();
}

void pesquisa (){
		int cont = 0, codigo, aux = 2;
		
		printf ("Digite o codigo do Funcionario: ");
		scanf ("%d", &codigo);
		printf ("\nPesquisando no Banco de Dados...");
		
		FILE *arquivo;
	 	arquivo = fopen("dados.txt", "r");
	 	
	 	while (!feof(arquivo)){
			fread(&cadastro[cont], sizeof(struct dados), 1, arquivo);
			
			if (!feof(arquivo)){
				if (codigo == cadastro[cont].cod){
					aux = 1;	
					printf ("\n\n\nCadastro Encontrado !!");
					printf("\nCodigo: %d", cadastro[cont].cod);
        			printf("\nNome: %s",cadastro[cont].nome);
        			printf("Salario: %5.2f\n",cadastro[cont].salario);
        			printf("Setor: %s\n",cadastro[cont].setor);
        			printf("Funcao: %s\n\n\n",cadastro[cont].funcao);
				} 
			cont++;
			} 
		}
		if (aux == 2){
			printf ("\nCadastro NAO Encontrado !!\n\n");
		}		
		main ();
}

void excluir (){
	int cont = 0, i = 0, codigo;
	
	printf ("Digite o codigo do Funcionario: ");
	scanf ("%d", &codigo);

	FILE *arquivo;
    arquivo = fopen("dados.txt", "r+");
		
    	while (!feof(arquivo)){				
    	fread(&cadastro[i], sizeof(struct dados), 1, arquivo);
    	
    	if (!feof(arquivo)){			
    		cont = cadastro[i].cod + 1;
    		i++;						
    	}
		}
    
    			arquivo = fopen("dados.txt", "w");
    			for(i=0; i < cont; i++){
    				if (cadastro[i].cod != codigo){
    					fwrite(&cadastro[i], sizeof(struct dados), 1, arquivo);
    				}
    			}
    			fclose(arquivo);
    			
    	main ();
}

int main (){
	int op;
	
	printf ("\nEscolha uma opcao\n");
	printf ("\n(1) - Para Cadastrar");
	printf ("\n(2) - Para Listar");
	printf ("\n(3) - Media de Salario dos funcionarios");
	printf ("\n(4) - Pesquisar Funcionario pelo Codigo de Cadastro");
	printf ("\n(5) - Excluir Cadastro");
	printf ("\n(0) - Sair \n>> ");
	scanf ("%d", &op);
	
	if (op == 1){
		cadastrar ();
	}
	if (op == 2){
		listar ();
	}
	if (op == 3){
		media ();
	}
	if (op == 4){
		pesquisa ();
	}
	if (op == 5){
		excluir();
	}
	if (op == 0){
		return 0;
	}
}

Link to comment
Share on other sites

  • 0

Pois cara.. eu te ajudo, add eu ai pelo skype e falamos. Fica difícil eu explicar tudo aqui né?

Si você quiser ajuda para melhorar realmente sua forma de programar, eu te estou oferecendo ajuda de bom agrado. Acha que te vai servir de ajuda si simplesmente eu 'maquiar' o seu código, ou você acha melhor eu te explicar onde é que estão os, e como você pode melhorar ele, etc.

Si quiser que eu retoco ele, posso fazer isso em 30 minutos, más não sei em que isso vai te ajudar. Acho melhor explicar os erros e debater em tempo real os problemas que ficar de ping pong no forum.

Espero sua resposta. Agora depende de si realmente você quer ou não receber ajuda. La no skype me chamo igual.

Em uma tarde você pode ficar afinado no tema de arquivos, não é brincadeira.

Link to comment
Share on other sites

  • 0

valeu.. Eu costumo estar bem tarde. Marque uma hora lá ou tente falar comigo em diferentes horas ;). quase sempre estou, más as vezes posso estar ausente um tempo.

Sorte.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.8k
    • Total Posts
      646.6k
×
×
  • Create New...