Ir ao conteúdo
  • Cadastre-se

C O fclose está com problema!


Daniel Oliveira

Posts recomendados

Eu estou tentado fazer uma espécie de e-mail em C, mas estou com um pequeno problema: o fclose da linha 39 (que está depois do término de um for, no primeiro programa) não está funcionando. O programa compila normalmente mas, na hora da execução (desse comando), fica apenas carregando. Vou colocar os scripts abaixo para vocês entenderem.

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>
#include<locale.h>
#include<time.h>

int main(){
	setlocale(LC_CTYPE,"Portuguese");
	FILE *CaixaEntrada;
	int a, i, op, hor;
	char mensagem[100], email[10000], ContaAtual[100];
	char texto[10000], email2[100], tempo[20];
	char nome[50], sobrenome[50];
	struct tm * tm;
	time_t t;
	CxEnt: CaixaEntrada = fopen("ContaAtual.txt","r");
	if(feof(CaixaEntrada)) system("EntrarConta.exe");
	fgets(ContaAtual,100,CaixaEntrada);
	strcpy(email,ContaAtual);
	strcat(email,"CaixaEntrada");
	strcat(email,".txt");
	fclose(CaixaEntrada);
	CaixaEntrada = fopen(ContaAtual,"r");
	fgets(nome,50,CaixaEntrada);
	fgets(sobrenome,50,CaixaEntrada);
	nome[strlen(nome)-1] = '\0';
	sobrenome[strlen(sobrenome)-1] = '\0';
	fclose(CaixaEntrada);
	system("cls");
	printf("CAIXA DE ENTRADA de %s %s\n\n",nome,sobrenome);
	CaixaEntrada = fopen(email,"r");
	printf("Mensagens novas:\n\n");
	for(;;){
		fgets(mensagem,1000,CaixaEntrada);
		if(strcmp(mensagem,"\n")!=0) printf("-> %s\n",mensagem);
		else break;
	}
	fclose(CaixaEntrada);
	CaixaEntrada = fopen(email,"w");
	fclose(CaixaEntrada);
	printf("\n(1) Sair da Conta\n");
	printf("(2) Escrever\n");
	printf("(3) Sair\n");
	op = getchar();
	op-=48;
	if(op==1){
		fclose(CaixaEntrada);
		CaixaEntrada = fopen("ContaAtual.txt","w");
		fclose(CaixaEntrada);
		system("cls");
		printf("Saindo...");
		Sleep(500);
		system("EntrarConta.exe");
	}
	if(op==2){
		fclose(CaixaEntrada);
		system("cls");
		printf("\t\tESCREVER\n\n");
		printf("Digite o endereço de e-mail do destinatário (sem @nimail.com): ");
		scanf("%s",email2);
		printf("Digite o e-mail (não dê ENTER até acabar): ");
		fflush(stdin);
		gets(texto);
		strcpy(email,email2);
		strcat(email,"CaixaEntrada");
		strcat(email,".txt");
		CaixaEntrada = fopen(email,"a");
		time(&t);
		tm = localtime(&t);
		sprintf(tempo,"%s",asctime(tm));
		tempo[strlen(tempo)-1] = '\0';
		printf("(%s)\n",tempo);
		fprintf(CaixaEntrada,"%s | ",tempo);
		fprintf(CaixaEntrada,"%s | De %[email protected]\n\n",texto,ContaAtual);
		fclose(CaixaEntrada);
		printf("Texto enviado con sucesso!\n");
		j: printf("(1) Voltar para a caixa de entrada\n");
		printf("(2) Sair da conta\n");
		op = getch();
		printf("%c\n",op);
		if(op=='1') goto CxEnt;
		else if(op=='2'){
			CaixaEntrada = fopen("ContaAtual.txt","w");
			fclose(CaixaEntrada);
			system("cls");
			printf("Saindo...");
			Sleep(500);
			system("start EntrarConta.exe");
		}
		else{
			printf("Opção inválida!! Digite 1 ou 2.\n");
			goto j;
		}
	}
	if(op==3){
		getch();
		exit(2);
	}
}


  

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

int main(){
	FILE *nconta;
	FILE *GeraConta;
	FILE *email;
	setlocale(LC_CTYPE,"Portuguese");
	struct nascimento{
		int dia;
		int mes;
		int ano;
	};
	char email2[100];
	struct conta{
		char nome[50];
		char sobrenome[50];
		char endereco[20];
		char senha[30];
		int idade;
		struct nascimento data;
		char sexo;
	}contas;
	
	int numconta, a, i, anoi;
	char data[10], anoc[5];
	
	printf("CRIAR CONTA NO NIMAIL\n\n");
	printf("Seu primeiro nome: ");
	scanf("%s",&contas.nome);
	printf("\nSeu sobrenome: ");
	scanf("%s",&contas.sobrenome);
	printf("\nDigite um endereço de email: ");
	GeraEndereco: scanf("%s",&contas.endereco);
	GeraConta = fopen(contas.endereco,"r");
	if(GeraConta != NULL){
		fclose(GeraConta);
		printf("Esse endereço já foi usado. Tente outro!");
		goto GeraEndereco;
	}
	fclose(GeraConta);
	GeraConta = fopen(contas.endereco,"a");
	printf("\nDigite o dia de seu nascimento: ");
	scanf("%d",&contas.data.dia);
	printf("Digite o mês de seu nascimento: ");
	scanf("%d",&contas.data.mes);
	printf("Digite o ano de seu nascimento: ");
	scanf("%d",&contas.data.ano);
	_strdate(data);
	a=0;
	for(i=6; i<strlen(data); i++){
		anoc[a] = data[i];
		a++;
	}
	anoi = atoi(anoc)+2000;
	contas.idade = anoi - contas.data.ano;
	printf("\nQual é seu sexo ('M' para masculino, 'F' para feminino): ");
	contas.sexo = getch();
	printf("%c\n",contas.sexo);
	printf("\nDigite sua senha: ");
	scanf("%s",&contas.senha);
	fprintf(GeraConta,"%s\n%s\n",contas.nome,contas.sobrenome);
	fprintf(GeraConta,"%d/%d/%d\n",contas.data.dia,contas.data.mes,contas.data.ano);
	fprintf(GeraConta,"%c\n",contas.sexo);
	fprintf(GeraConta,"%s\n",contas.senha);
	fclose(GeraConta);
	system("pause");
	system("cls");
	printf("Cadastramento feito com sucesso.\n");
	printf("Você já pode sair! Pressione qualquer tecla para sair...\n");
	getch();
	strcpy(email2,contas.endereco);
	strcat(email2,"CaixaEntrada");
	strcat(email2,".txt");
	email = fopen(email2,"a");
	fclose(email);
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<locale.h>
#include<windows.h>

void erro(){
	printf("Erro! Email ou senha inválidos!\n");
	getch();
}

int main(){
	setlocale(LC_CTYPE,"Portuguese");
	FILE *EntraConta;
	int a, i, op;
	char email[50], senha[20], senha1[20];
	char nome[50], sobrenome[50], h=0;
	//REDIRECIONA PARA CAIXA DE ENTRADA SE JÁ TIVER NUMA CONTA...
	EntraConta = fopen("ContaAtual.txt","r");
	if(EOF) goto escolha;
	
	fscanf(EntraConta,"%s",&email);
	fclose(EntraConta);
	EntraConta = fopen(email,"r");
	fgets(nome,50,EntraConta);
	fgets(sobrenome,50,EntraConta);
	nome[strlen(nome)-1] = '\0';
	sobrenome[strlen(sobrenome)-1] = '\0';
	printf("Redirecionado para caixa de entrada de %s %s...",nome,sobrenome);
	fclose(EntraConta);
	Sleep(1000);
	system("cls");
	system("Email.exe");
	
	//-----------------------------------------------------------------
	//ENTRAR NUMA CONTA OU CRIAR CONTA
	escolha:
		system("cls");
		printf("Escolha uma opção:\n");
		printf("(1) Entrar na minha conta\n");
		printf("(2) Criar uma conta\n");
		fflush(stdin);
		op=getchar();
		op-=48;
		//ENTRAR NA CONTA
		if(op==1){
			entrar: system("cls");
			printf("Digite 1 para voltar.\n");
			printf("Digite seu endereço de email (sem @nimail.com): ");
			scanf("%s",&email);
			if(atoi(email)==1) goto escolha;
			EntraConta = fopen(email,"r");
			printf("Senha: ");
			scanf("%s",&senha);
			if(EntraConta == NULL){
				erro();
				goto entrar;
			}
			while(fgets(senha1,20,EntraConta) != NULL);
			senha1[strlen(senha1)-1]='\0';
			if(strcmp(senha,senha1)==0){
				EntraConta = fopen("ContaAtual.txt","w");
				fprintf(EntraConta,"%s",email);
				fclose(EntraConta);
				EntraConta = fopen(email,"r");
				fgets(nome,50,EntraConta);
				fgets(sobrenome,50,EntraConta);
				nome[strlen(nome)-1] = '\0';
				sobrenome[strlen(sobrenome)-1] = '\0';
				printf("Redirecionado para caixa de entrada de %s %s...",nome,sobrenome);
				fclose(EntraConta);
				Sleep(1000);
				system("cls");
				system("Email.exe");
			}
			else{
				erro();
				goto entrar;
			}
		}
		//-----------------------------------------------------------------
		//CRIAR CONTA
		else if(op==2){
			system("cls");
			system("CadastramentoNiMail.exe");
			goto escolha;
		}
		//-----------------------------------------------------------------
		//OPÇÃO INVÁLIDA
		else{
			printf("Opção inválida!!\n");
			getch();
			goto escolha;
		}
		//-----------------------------------------------------------------
}

 

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

@Daniel Oliveira     o fclose funciona bem ,  e ele fica direto carregando é por que entra em um Loop infinito :

#include<stdio.h>
#include<algorithm>
#include<conio.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>
#include<locale.h>
#include<time.h>
int main()
{
    printf("Content-type: text/plain\n\n");
    printf("Ola, Mundo!");

/*
 *    precisa usar esse CGI
 */

	FILE *CaixaEntrada;
	int a, i, op, hor;
	char mensagem[100], email[10000], ContaAtual[100],
	     texto[10000], email2[100], tempo[20],
	     nome[50], sobrenome[50];
	struct tm * tm;
	time_t t;
	printf("aqui 1     Tecle\n");
	getch();
	CxEnt: CaixaEntrada = fopen("ContaAtual.txt","r");
	printf("aqui 2     Tecle\n");
	getch();
//    if(feof(CaixaEntrada)) system("notepad.exe");// esse executável não tenho ->   EntrarConta.exe
	printf("aqui 3     Tecle\n");
	getch();
	fgets(ContaAtual,100,CaixaEntrada);
	printf("aqui 4     Tecle\n");
	getch();
	strcpy(email,ContaAtual);
	strcat(email,"CaixaEntrada");
	strcat(email,".txt");
	fclose(CaixaEntrada);
	CaixaEntrada = fopen(ContaAtual,"r");
	fgets(nome,50,CaixaEntrada);
	fgets(sobrenome,50,CaixaEntrada);
	nome[strlen(nome)-1] = '\0';
	sobrenome[strlen(sobrenome)-1] = '\0';
	fclose(CaixaEntrada);
	system("cls");
	printf("CAIXA DE ENTRADA de %s %s\n\n",nome,sobrenome);
	printf("aqui 5 nome -> %s     Tecle\n",nome);
	getch();
	CaixaEntrada = fopen(email,"r");
	printf("Mensagens novas:\n\n");
	//for(;;){     aqui entra nesse Loop 
	while( 1 )  // aqui seria igual a hum while
    {
		fgets(mensagem,1000,CaixaEntrada);
		if(strcmp(mensagem,"\n")!=0) printf("-> %s\n",mensagem);
		else break;
		getch();
	}
	//   e não sai desse Loop nunca
	fclose(CaixaEntrada);  // mas o fclose não tem nada a ver com o erro
	printf("aqui\n");
	getch();
	CaixaEntrada = fopen(email,"w");
	fclose(CaixaEntrada);
	printf("\n(1) Sair da Conta\n");
	printf("(2) Escrever\n");
	printf("(3) Sair\n");
	op = getchar();
	op-=48;
	if(op==1){
		fclose(CaixaEntrada);
		CaixaEntrada = fopen("ContaAtual.txt","w");
		fclose(CaixaEntrada);
		system("cls");
		printf("Saindo...");
		Sleep(500);
		system("EntrarConta.exe");
	}
	if(op==2){
		fclose(CaixaEntrada);
		system("cls");
		printf("\t\tESCREVER\n\n");
		printf("Digite o endereço de e-mail do destinatário (sem @nimail.com): ");
		scanf("%s",email2);
		printf("Digite o e-mail (não dê ENTER até acabar): ");
		fflush(stdin);
		gets(texto);
		strcpy(email,email2);
		strcat(email,"CaixaEntrada");
		strcat(email,".txt");
		CaixaEntrada = fopen(email,"a");
		time(&t);
		tm = localtime(&t);
		sprintf(tempo,"%s",asctime(tm));
		tempo[strlen(tempo)-1] = '\0';
		printf("(%s)\n",tempo);
		fprintf(CaixaEntrada,"%s | ",tempo);
		fprintf(CaixaEntrada,"%s | De %[email protected]\n\n",texto,ContaAtual);
		fclose(CaixaEntrada);
		printf("Texto enviado con sucesso!\n");
		j: printf("(1) Voltar para a caixa de entrada\n");
		printf("(2) Sair da conta\n");
		op = getch();
		printf("%c\n",op);
		if(op=='1') goto CxEnt;
		else if(op=='2'){
			CaixaEntrada = fopen("ContaAtual.txt","w");
			fclose(CaixaEntrada);
			system("cls");
			printf("Saindo...");
			Sleep(500);
			system("start EntrarConta.exe");
		}
		else{
			printf("Opção inválida!! Digite 1 ou 2.\n");
			goto j;
		}
	}
	if(op==3){
		getch();
		exit(2);
	}
}

 

Link para o comentário
Compartilhar em outros sites

@devair1010 , muito obrigado pela ajuda e pela boa explicação! Mas o problema não foi solucionado. Aí eu vi que a variável "mensagem" não suportava a quantidade de texto pedido naquele while.

// Na declaração
char mensagem[100], email[10000], ContaAtual[100], // Veja que "mensagem" só suporta 100 caracteres
     texto[10000], email2[100], tempo[20],
     nome[50], sobrenome[50];

while(fgets(mensagem,10000,CaixaEntrada)!=NULL){ // E aqui eu estava pedindo 10.000 caracteres
		printf("-> %s\n",mensagem);
}

 

  • Curtir 1
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!