Ir ao conteúdo
  • Cadastre-se

C++ Laços com caracteres em funções (Não funcionam)


João202020

Posts recomendados

Fala pessoal. Comecei há um tempo atrás na faculdade e estava tendo uma grande dificuldade em arrumar uma forma de excluir dados de um arquivo texto, até que consegui desenvolver uma lógica talvez fora do convencional para quem já conhece mais a linguagem C. Mas por algum motivo a lógica que estou usando não funciona fora da função principal. Alguém poderia me ajudar a resolver ou talvez sugerir uma forma mais adequada de realizar essa tarefa?

 

O código:

 

OBS: o erro está localizado na funcao excadpac que foi declarada dentro da funcao excadp

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

#define erro system("msg * Opção inválida....");
#define logErro system("msg * ID ou PIN inválidos..."); printf("\x7");

void cadastroPac();
void cadastroFun();
void cadastro();
void admlog();
void admscr();
void relatorio();
void listp();
void listf();
void excadp(); //funcao com loop foi declarada dentro dessa
void excadf(); 



void cabecalho();

struct cad{
	
	char nome [101];
	char dataDeNascimento [14];
	char dataDeContrato [14]; 
	char rg [16];
	char cpf [20];

	char endereco [101];
	char bairro [41];
	char complemento [41];
	int num;
	char cidade [41];
	char setor [41];
	
	char areaDeTrabalho [41] ;
	char obs [601] ;
	
	int id;
	int pin;
	float salario;

	char telefone [41];
	char email [101];

};



char idAdm [5] = {'F','G','4','5','6'};
int pin = 94292;

char id [5];
int pin2;

bool logstatadm;

int main (){
	
	void funclog();
	void help();
	void tema();
	
	setlocale(LC_ALL,"portuguese");
	
	in:
	
	system("cls");
	
	cabecalho();
	
	int op;
	
	printf("Selecione o serviço de acordo com o número correspondente e tecle ENTER\n\n");
	
	printf(" 1 - Tela de administrador\n");
	printf(" 2 - Tela de funcionário\n");
	printf(" 3 - Ajuda\n");
	printf(" 4 - Configurações do console\n");
	printf(" 5 - Sair \n");
	
	scanf("%i",&op);
	
	switch(op){
		
		case 1:
			admlog();
		break;
			
		case 2:
			funclog();
		break;
			
		case 3:
			help();
		break;
			
		case 4:
			tema();
		break;	
		
		case 5:
			printf("===========================================\n");
			printf("============ Fim de execução.. ============\n");
			printf("===========================================\n\n\n\x7");
			return 0;
		break;
		
		default:
			erro;
		goto in;
			
	}
	
	goto in;
	
	system("pause");
	return 0;
}

void cabecalho(){
	
	printf("===========================================\n");
	printf("======== Health 'n Clean - Console ========\n");
	printf("===========================================\n\n");	
		
}


void tema(){
	
	int sv;
			
			printf("\nEscolha um tema de acordo com as opções abaixo: \n\n");
			printf(" 1 - Escuro\n 2 - Claro\n 3 - Céu\n 4 - Matrix\n 5 - Eco\n");
			
			scanf("%i",&sv);
			
		switch (sv)
		{
			
			case 1:
				system("color 07");
			break;	
				
			case 2:
				system("color f0");
			break;
					
			case 3:
				system("color 9f");
			break;
				
			case 4:
				system("color 0A");		
			break;
				
			case 5:
					
				system("color 1A");
			break;	
				
			default:
				erro;
			break;				
			}
			
	system("cls");
}

void help(){
	
	// PENDENTE
}

void funclog(){
	
	// PENDENTE
}

void admlog(){
	
	
	
	if(logstatadm == true){
		
		admscr();
	}

	else{
		
		system("cls");
		printf("TELA DE LOGIN\n\n");
		printf("ID: ");
		setbuf(stdin,NULL);
			scanf("%s",&id);
		
		
		
		printf("PIN: ");
			scanf("%i",&pin2);
			
		if(strcmp(idAdm,id) == 0 and pin2 == pin){
			
			logstatadm = true;
			admscr();
			
		}
	
		else{
			
			logErro;
			
		}	
	}
}

void admscr(){
	
	a:system("cls");
	
	int op;
	
	printf("TELA DE ADMINISTRADOR\n\n");
	
	printf("Selecione o serviço de acordo com o número correspondente e tecle ENTER\n\n");
	
	printf(" 1 - Cadastro\n");
	printf(" 2 - Relatórios\n");
	printf(" 3 - Deslogar conta\n");
	printf(" 4 - Voltar ao menu\n");
	
	scanf("%i",&op);
	
	switch(op){
		
		case 1:
			cadastro();
		break;
		
		case 2:
			relatorio();
		break;
		
		case 3:
			logstatadm = false;
			
		break;
		
		case 4:
			main();		
		break;	
		
		default:
			erro;
			goto a;
		break;	
		
	}
	
	goto a;
}

void cadastro(){
	
	int op;
	
	char *dados;
	dados = (char*) malloc(sizeof(char)+1);

	in:
	
	system("cls");
	
	printf("Selecione a opção de cadastro: \n\n");
	
	printf(" 1 - Cadastro de pacientes\n");
	printf(" 2 - Cadastro de funcionários\n");
	printf(" 3 - Listar Pacientes\n");
	printf(" 4 - Listar Funcionarios\n");
	printf(" 5 - Excluir cadastro de pacientes\n");
	printf(" 6 - Excluir cadastro de funcionário");
	printf(" 7 - Voltar a tela anterior");
		scanf("%i",&op);
		
	switch(op){
		
		case 1:
			cadastroPac();
		break;
			
		case 2:
			cadastroFun();
		break;
		
		case 3:
			listp();
		break;
		
		case 4:
			listf();
		break;
		
		case 5:
			excadp();
		break;
		
		case 6:
			excadf();
		break;	
		
		case 7:
			admscr();
		break;
		
		default:
			goto in;
			erro;		
		break;	
	}
	
	
}

void excadp(){ //FUNCAO PARA EXCLUSAO
	
	void excadpac(int z);
	
	system("cls");
	
	setbuf(stdin,NULL);
	setbuf(stdout,NULL);
	
	char *dados;
	dados = (char*) malloc(sizeof(char)+1);
	
	char a;
	
	int CAD;
	int j = 0;
	int z = 0;
	
	
	FILE *file = fopen("Pacientes.txt","rb");
	setbuf(file,NULL);
	
	while(fread(&a,sizeof(a),1,file)!= NULL){
		
		if(a == '*'){
			
			z++;
			
		}
		printf("%c",a);
		
	}
	
	excadpac(z);

	
}				//OBSERVAÇÃO: AINDA NÃO FIZ A FUNCAO PARA TRANSFERIR OS DADOS DO ARQUIVO TEMPORARIO PARA O ARQUIVO PRINCIPAL.

void excadpac(int z){ //FUNCAO PARA EXCLUSAO DE DADOS DE ARQUIVO TXT 
	
	
	FILE *file = fopen("Pacientes.txt","rb");
	
		int op;
		int contador;
		char a;
		
		printf("\n");
		printf("Qual dos %i cadastros você deseja excluir?\n",z);
		scanf("%i",&op);
	
	do{														//OCORRE ALGUM ERRO NAS CONDIÇÕES DENTRO DO LOOP
		while(fread(&a,sizeof(a),1,file) != NULL){

		FILE *arq;
		arq = fopen("temporario.txt","ab");
			
			if(a != '*'){
				if(contador != op){
					
				printf("%c",a);
				fprintf(arq,"%c",a);
				fclose(arq);
					}
				}
				
			else{
				if(contador == op){
				goto in;
				}	
				fprintf(arq,"*");
				fclose(arq);	
				goto in;
				
				}
		}
		
	
		
		in:
		contador++;			
		
	}while(contador != z);
	
	
	printf("\n");
	
	system("pause");
	
}

void listp(){ //LISTAR PACIENTES CADASTRADOS
	
	
	
	char *dados;
	dados = (char*) malloc(sizeof(char));
	
	FILE *file;
	file = fopen("Pacientes.txt","rb");
	
	system("cls");
	
	printf("PACIENTES CADASTRADOS NO SISTEMA: \n\n");
	
	while(fgets(dados,sizeof(dados),file)!=NULL){
		
		printf("%s",dados);
		
	}
	printf("\n");
	system("pause");
	
	
	
}

void excadf(){ //EXCLUIR CADASTRO DE FUNCIONARIOS
	
	//pendente

}

void listf(){ //LISTAR CADASTROS DE FUNCIONARIOS
		
	char *dados;
	dados = (char*) malloc(sizeof(char));
	
	FILE *file;
	file = fopen("Funcionarios.txt","rb");
	
	system("cls");
	
	printf("FUNCIONARIOS CADASTRADOS NO SISTEMA: \n\n");
	
	while(fgets(dados,sizeof(dados),file)!=NULL){
		
		printf("%s",dados);
		
	}
	
	printf("\n");
	system("pause");
	
	
}
void cadastroPac(){ //CADASTRO DE PACIENTES
	
	cad pac;
	
	char c;	
	
	do{
	system("cls");
	
	printf("\tTELA DE CADASTRO\n\n");
	
	printf("INSTRUÇÕES:\n\n");
	
	printf(" 1 - Digite o CPF e o RG usando pontos e traços\n"); 
	printf(" ATENÇÃO! NÃO use espaços.\n\n");
	
	printf(" \tModelo CPF: XXX.XXX.XXX-XX\n");
	printf(" \tModelo RG: XX.XXX.XXX-X\n\n");
	
	printf(" 2 - Limite de caracteres: \n\n");
	
	printf(" Nome 100 caracteres.\n");
	printf(" Data 10 caracteres\n\n\tModelo data: XX/XX/XXXX\n");
	
	printf(" \n");
	printf(" Endereço 100 caracteres\n");
	printf(" Bairro 40 caracteres\n");
	printf(" Complemento 40 caracteres\n");
	printf(" Unidade de atendimento 40 caracteres\n");
	printf(" Telefone 40 caracteres\n");
	printf(" Email 100 caracteres\n");
	printf(" Observaçoes (ou informações adicionais) 600 caracteres\n\n");
	
	printf("Digite o CPF: ");
		scanf("%s",&pac.cpf);
	
	printf("Digite o nome: ");
		setbuf(stdin,NULL);
		gets(pac.nome);
		
	printf("Data de nascimento: ");
		setbuf(stdin,NULL);
		gets(pac.dataDeNascimento);
	
	printf("Digite o RG: ");
		setbuf(stdin,NULL);
		scanf("%s",&pac.rg);
		
	printf("Endereço: ");
		setbuf(stdin,NULL);
		gets(pac.endereco);
	
	printf("Número: ");
		scanf("%i",&pac.num);
	
	printf("Bairro: ");
		setbuf(stdin,NULL);
		gets(pac.bairro);

		
	printf("Cidade: ");
		setbuf(stdin,NULL);
		gets(pac.cidade);
		
	printf("Unidade de atendimento: ");
		setbuf(stdin,NULL);
		gets(pac.setor);
	
	printf("Telefone: ");
		setbuf(stdin,NULL);
		gets(pac.telefone);
		
	printf("Email: ");
		setbuf(stdin,NULL);
		gets(pac.email);
		
	printf("Observações(ou informações adicionais): ");	
		setbuf(stdin,NULL);
		gets(pac.obs);	
				
	system("cls");
	printf("====== Ficha de Cadastro ======\n\n");			
	
	printf("Nome: %s\n",pac.nome);
	printf("CPF: %s \tRG: %s\n",pac.cpf,pac.rg);
	printf("Data de nascimento: %s\n",pac.dataDeNascimento);
	printf("Endereço: %s Nº %i\n",pac.endereco,pac.num);
	printf("%s, %s\n",pac.bairro,pac.cidade);
	printf("Unidade de Atendimento: %s\n",pac.setor);
	printf("Telefone: %s",pac.telefone);
	printf("\tEmail: %s\n\n",pac.email);
	printf("Informações adicionais: %s\n\n",pac.obs);
	
	system("pause");	
			
	FILE *file;
	
	file = fopen("Pacientes.txt","ab");
	
	fprintf(file,"Nome: %s\n",pac.nome);
	fprintf(file,"CPF: %s \tRG: %s\n",pac.cpf,pac.rg);
	fprintf(file,"Data de nascimento: %s\n",pac.dataDeNascimento);
	fprintf(file,"Endereço: %s Nº %i\n",pac.endereco,pac.num);
	fprintf(file,"%s, %s\n",pac.bairro,pac.cidade);
	fprintf(file,"Unidade de Atendimento: %s\n",pac.setor);
	fprintf(file,"Telefone: %s",pac.telefone);
	fprintf(file,"\tEmail: %s\n\n",pac.email);
	fprintf(file,"Informações adicionais: %s*\n\n",pac.obs);
	fclose(file);
	
	
		
	
	printf("Deseja cadastrar novamente (s/n)?\n\n");
	
	c=getch();

	}while(c == 's' or c == 'S');
	
	
}

void cadastroFun(){ //CADASTRO DE FUNCIONARIOS
	
	cad fun;
	
	char c;	
	
	do{
	system("cls");
	
	printf("\tTELA DE CADASTRO\n\n");
	
	printf("INSTRUÇÕES:\n\n");
	
	printf(" 1 - Digite o CPF e o RG usando pontos e traços\n"); 
	printf(" ATENÇÃO! NÃO use espaços.\n\n");
	
	printf(" \tModelo CPF: XXX.XXX.XXX-XX\n");
	printf(" \tModelo RG: XX.XXX.XXX-X\n\n");
	
	printf(" 2 - Limite de caracteres: \n\n");
	
	printf(" Nome 100 caracteres.\n");
	printf(" Data 10 caracteres\n\n\tModelo data: XX/XX/XXXX\n");
	
	printf(" \n");
	printf(" Endereço 100 caracteres\n");
	printf(" Bairro 40 caracteres\n");
	printf(" Complemento 40 caracteres\n");
	printf(" Unidade de atendimento 40 caracteres\n");
	printf(" Telefone 40 caracteres\n");
	printf(" Email 100 caracteres\n");
	printf(" Observaçoes (ou informações adicionais) 600 caracteres\n\n");
	
	
	printf("Digite o nome: ");
		setbuf(stdin,NULL);
		gets(fun.nome);
		
	printf("Data de nascimento: ");
		setbuf(stdin,NULL);
		gets(fun.dataDeNascimento);
	
	printf("Digite o CPF: ");
		scanf("%s",&fun.cpf);
	
	printf("Digite o RG: ");
		setbuf(stdin,NULL);
		scanf("%s",&fun.rg);
		
	printf("Endereço: ");
		setbuf(stdin,NULL);
		gets(fun.endereco);
	
	printf("Número: ");
		scanf("%i",&fun.num);
	
	printf("Complemento: ");
		setbuf(stdin,NULL);
		gets(fun.complemento);
	
	printf("Bairro: ");
		setbuf(stdin,NULL);
		gets(fun.bairro);

		
	printf("Cidade: ");
		setbuf(stdin,NULL);
		gets(fun.cidade);
		
	printf("Unidade de atendimento: ");
		setbuf(stdin,NULL);
		gets(fun.setor);
		
	printf("Área de trabalho: ");	
		setbuf(stdin,NULL);
		gets(fun.areaDeTrabalho);
	
	printf("Salário: R$");
		scanf("%f",&fun.salario);
			
	printf("Telefone: ");
		setbuf(stdin,NULL);
		gets(fun.telefone);
		
	printf("Email: ");
		setbuf(stdin,NULL);
		gets(fun.email);
		
	printf("Observações(ou informações adicionais): ");	
		setbuf(stdin,NULL);
		gets(fun.obs);	
				
	system("cls");
	printf("====== Ficha de Cadastro ======\n\n");			
	
	printf("Nome: %s\n",fun.nome);
	printf("CPF: %s \tRG: %s\n",fun.cpf,fun.rg);
	printf("Data de nascimento: %s\n",fun.dataDeNascimento);
	printf("Endereço: %s Nº %i Complemento: %s\n",fun.endereco,fun.num,fun.complemento);
	printf("%s, %s\n",fun.bairro,fun.cidade);
	printf("Área: %s\n",fun.areaDeTrabalho);
	printf("Salário: %.2f",fun.salario);
	printf("Setor: %s\n",fun.setor);
	printf("Telefone: %s",fun.telefone);
	printf("\tEmail: %s\n\n",fun.email);
	printf("Informações adicionais: %s\n\n",fun.obs);
	
	system("pause");	
			
	FILE *file;
	
	file = fopen("Funcionarios.txt","ab");
	
	fprintf(file,"Nome: %s\n",fun.nome);
	fprintf(file,"CPF: %s \tRG: %s\n",fun.cpf,fun.rg);
	fprintf(file,"Data de nascimento: %s\n",fun.dataDeNascimento);
	fprintf(file,"Endereço: %s Nº %i Complemento: %s\n ",fun.endereco,fun.num,fun.complemento);
	fprintf(file,"%s, %s\n",fun.bairro,fun.cidade);
	fprintf(file,"Área: %s\n",fun.areaDeTrabalho);
	fprintf(file,"Salário: %.2f",fun.salario);
	fprintf(file,"Setor: %s\n",fun.setor);
	fprintf(file,"Telefone: %s",fun.telefone);
	fprintf(file,"\tEmail: %s\n\n",fun.email);
	fprintf(file,"Informações adicionais: %s*\n\n",fun.obs);
	fclose(file);
	
	printf("Deseja cadastrar novamente (s/n)?\n\n");
	
	c=getch();

	}while(c == 's' or c == 'S');
	
	
	
}

void relatorio(){
	
	char c;
	
	int p = 0;
	int f = 0;
	int l;
	
	float r;
	
	FILE *file = fopen("Pacientes.txt","rb");
	
	while(fread(&c,sizeof(c),1,file) != NULL){
		if(c == '*'){
			p++;
		}
	
	}
	
	file = fopen("Funcionarios.txt","rb");
	
	while(fread(&c,sizeof(c),1,file) != NULL){
		if(c == '*'){
			f++;
		}
	}
	
	printf("Pacientes cadastrados nesta unidade: %i\n",p);
	printf("Funcionários cadastrados nesta unidade: %i\n",f);
	printf("Receita: %.2f\n",r);
	
	system("pause");
	
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@João202020    a declaração de todas as funções é feita antes da função main , não entendi o motivo de você declarar essa função dentro da função excadp ,  mas creio que o que esteja causando erro mesmo é usar o fprintf ,  junto com fwrite e fread ,  pois o fprintf é usado para arquivo txt , e fwrite e fread para arquivo binário ,  e trabalhar com arquivos é muito difícil , é melhor fazer essa exclusão na struct mesmo ,  então no início do programa você  pega todos os dados que estão no aquivo e coloca na struct , e durante o programa você cadastra edita lista e remove dados na struct e no final na hora que clicar em sair , faz a gravação de todas as posições da struct no arquivo binário .

Link para o comentário
Compartilhar em outros sites

 

	case 4:
		main();
		break;

 

main() é chamada pelo sistema quando seu programa é carregado. Nunca chame essa função de dentro de seu programa.

 

Seu programa tem muitos erros e um programa com centenas de linhas não deveria ter chegado a esse tamanho antes de estar correto em muitas coisas que parecem erradas aqui

 

Vou listar algumas coisas que acho que pode fazer e com as quais podemos aqui ajudar

  • escreva seu programa em torno dos dados. Sempre. está tratando com cadastros de funcionários e pacientes. Entenda que são a mesma coisa. Então provavelmente estaria melhor servido com alguma hierarquia nessas estruturas: funcionários e pacientes são pessoas, um paciente pode ser funcionário e vice-versa.

    Veja essas estruturas simples:
typedef struct 
{
	int  id;
	char nome[10];
	char rg[16];

}	Pessoa;

typedef struct
{
	int     id;
	Pessoa* p;
	char	cargo[20];
	char    admissao[20];
	int     chefe;

}	Funcionario;

typedef struct
{
	int     id;
	Pessoa* p;
	char	setor[20];
	char    patologia[20];
	int     cuidador;

}	Paciente;

typedef struct
{
	int         nPac;
	Paciente    cadP[20];
	int         nFunc;
	Paciente    cadF[20];

}	Clinica;


Removi muitos campos para exemplo. O que importa é que assim você poderia declarar 
 

	Clinica		HSJ;

 

E HSJ seria uma clínica com 20 pacientes e 20 funcionários para testar seu programa e sua lógica. Dentro de cada Clinica tem o que controla a clínica. Os campos tem um campo numérico id que ajuda a fazer buscas nos cadastros.

Conforme a coisa funcione fica fácil de acrescentar alocação dinâmica e ir modelando melhor as coisas. Mas comece pelos dados.

Usar alguma convenção para os nomes das estruturas também ajuda. Note que deixei no exemplo a primeira letra em maiúscula

 

  • Mantenha suas funções em ordem, como a ordem alfabética. Vai gostar conforme seu programa cresce. Ambinentes modernos de desenvolvimento permitem que você veja as funções numa lista. Veja essa no Visual Studio, para seu programa:

image.png.9ca519377bc9582c5b8b376f39362da0.png

 

A ideia é que você pode só clicar no nome da função e o editor vai para o início do código. Se estiverem em ordem, melhor ainda...

  • Não use void: em geral é um desperdício e muitas vezes um erro: retorne algo. Um status, um ponteiro para uma estrutura, um valor calculado. coisas assim
  • Em geral não edite nada DENTRO dos arquivos. Faça o simples: na entrada leia o conteúdo do arquivo ou parte dele para um vetor de estruturas, uma lista, algum tipo de container para os dados, na memória. Ao final do programa você renomeia o arquivo anterior e salva os novos dados. É mais rápido e seguro. Se acontecer algum erro no meio do programa pode corromper todos seus dados, para sempre.
  • Ao declarar seus protótipos declare ANTES as estruturas porque muitas vezes vai precisar delas para compilar os próprios protótipos...

 

  • Obrigado 2
Link para o comentário
Compartilhar em outros sites

Ainda sobre seu programa:

  • nunca, mas nunca mesmo use variáveis globais. Em geral não é permitido mesmo, nas empresas ou nas escolas. Isso só gera problemas.
  • nunca use system(). É um buraco negro em termos de segurança. E nada faz. Em geral também não é permitido. E se system() foi escrita em C e o sistema foi escrito em C então não deve ter nada que não consiga fazer em C...
  • Obrigado 2
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!