Ir ao conteúdo

C Programa de arquivos, o printf("%s") imprimindo coisa estranha


Ir à solução Resolvido por Ansi C,

Posts recomendados

  • Membro VIP
Postado

Olá, eu estava fazendo um programa para aprender a mexer com arquivos, e notei que quando imprimo algumas strings, em certos lugares saem coisas estranhas, gostaria de entender o por que disso. Agradeço quem puder me ajudar. Este é o meu código (coloquei comentários com asterisco na parte que imprime estranho):

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

// esse programa tem como objetivo apreender a mexer com arquivos (abrir, fechar, ler e escrever), com os comandos fopen, fclose, fgetc e fputc
int main(){
	FILE *pTexto;
	char anel[116]= "Um Anel para a todos governar, Um Anel para encontra-los, Um Anel para a todos trazer e na escuridao aprisiona-los ";
	char anelLeitura[116];
	char anelLeitura2[116];
	char anelLeitura3[116];
	int cont;
	pTexto = fopen("sauron.txt","w");
	if( pTexto == NULL ){
		printf("erro ao abrir o arquivo \n");
		exit(1);
	}
	for( cont = 0 ; cont <= 200 ; cont++ ){
		fputc( anel[cont] , pTexto );
		}
	fclose(pTexto);
	pTexto = NULL;
	pTexto = fopen("sauron.txt","r");
	for( cont = 0 ; cont <= 115; cont++ ){
		anelLeitura[cont] = fgetc(pTexto);
	}
	fclose(pTexto);
	pTexto = NULL;	
	printf("\nLEITURA 1.0:%s\n",anelLeitura);
	fclose(pTexto);

	// a parte a baixo é igual a parte de leitura a cima, porém e foi usada 
	//a constante EOF 
	pTexto = NULL;
	pTexto = fopen("sauron.txt","r");
	if( pTexto == NULL ){
		printf("erro ao abrir o arquivo \n");
		exit(1);
	}
	printf("\nLEITURA 1.1:%s\n",anelLeitura);
	
	for( cont = 0 ; ( anelLeitura2[cont] = fgetc(pTexto) )!= EOF ; cont++ ){ // acontece enquanto anelLeitura2[cont] for diferente de EOF,
	} // aqui o valor fgetc(pTexto) eh atribuido a variavel anelLeitura[cont] e entao eh verificado se esse valor eh diferente de EOF

	printf("\nLEITURA 1.2:%s\n",anelLeitura);// COISA ESTRANHA É IMRPIMIDA !!******************************************
	fclose(pTexto);
	pTexto = NULL;	
	printf("\nLEITURA 2.0%s\n",anelLeitura2);
	printf("\nLEITURA 1.3:%s\n",anelLeitura);// COISA ESTRANHA É IMRPIMIDA !! ******************************************


	// outra alternativa é usar o comando e feof(). Esse comando e util , pois em arquivos binarios um inteiro no meio do arquivo pode ter o valor igual a  null
	// o que indicaria o fim do arquivo sem chegar no final do arquivo
	pTexto = NULL;
	pTexto = fopen("sauron.txt","r");
	if( pTexto == NULL ){
		printf("erro ao abrir o arquivo \n");
		exit(1);
	}
	printf("\nLEITURA 2.1%s\n",anelLeitura2);
	printf("\nLEITURA 1.4:%s\n",anelLeitura);// COISA ESTRANHA É IMRPIMIDA !!******************************************
	for( cont = 0 ; !feof(pTexto) ; cont++ ){ // feof() retorna 0, quando nao se esta no final do arquivo, e retorna algo diferente de 0 quando se esta no final
		anelLeitura3[cont] = fgetc(pTexto);
	}
	fclose(pTexto);
	pTexto = NULL;	
	printf("\nLEITURA 3:%s\n",anelLeitura3); 
	printf("\nLEITURA 1.5:%s\n",anelLeitura);// COISA ESTRANHA É IMRPIMIDA !!******************************************
	printf("\nLEITURA 2.2:%s\n",anelLeitura2);// COISA ESTRANHA É IMRPIMIDA !!******************************************
	
	return 0;
}

 

  • Obrigado 1
  • Solução
Postado

@Arthur Vandellay O que é uma string em C, qual a diferença entre um vetor de caracteres e uma strings na linguagem C? Essa não é uma pergunta difícil, longe disso, não é nenhuma novidade é coisa velha d+, e vai te auto-educar com relação a seu problema. 

 

Muito fácil.

  • Obrigado 1
  • Membro VIP
Postado

Muito obrigado @AnsiC, consegui fazer funcionar, fui pesquisar a diferença e ai resolvi.

Se alguém quiser ver como o código ficou, esta aqui:

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

// esse programa tem como objetivo apreender a mexer com arquivos (abrir, fechar, ler e escrever), com os comandos fopen, fclose, fgetc e fputc
int main(){
	FILE *pTexto;
	char anel[115]= "Um Anel para a todos governar, Um Anel para encontra-los, Um Anel para a todos trazer e na escuridao aprisiona-los";
	char anelLeitura[115];
	char anelLeitura2[115];
	char anelLeitura3[115];
	int cont;
	pTexto = fopen("sauron.txt","w");
	if( pTexto == NULL ){
		printf("erro ao abrir o arquivo \n");
		exit(1);
	}
	/*for( cont = 0 ; cont <= 200 ; cont++ ){
		fputc( anel[cont] , pTexto );
	}*/
	for( cont = 0 ; cont <= 113; cont++ ){
		fputc( anel[cont] , pTexto );
	}
	fclose(pTexto);
	pTexto = NULL;
	pTexto = fopen("sauron.txt","r");
	for( cont = 0 ; cont <= 113; cont++ ){
		anelLeitura[cont] = fgetc(pTexto);
		
	}
	anelLeitura[cont]= '\0';
	fclose(pTexto);
	pTexto = NULL;	
	printf("\nLEITURA 1.0:%s\n",anelLeitura);
	fclose(pTexto);

	// a parte a baixo é igual a parte de leitura a cima, porém e foi usada 
	//a constante EOF para nao precisar determinar o tamanho do arquivo no for
	// EOF = end of file, dado que representa fim do arquivo, geralmente é -1
	pTexto = NULL;
	pTexto = fopen("sauron.txt","r");
	if( pTexto == NULL ){
		printf("erro ao abrir o arquivo \n");
		exit(1);
	}
	printf("\nLEITURA 1.1:%s\n",anelLeitura);
	
	for( cont = 0 ; ( anelLeitura2[cont] = fgetc(pTexto) )!= EOF ; cont++ ){ // acontece enquanto anelLeitura2[cont] for diferente de EOF,
	} // aqui o valor fgetc(pTexto) eh atribuido a variavel anelLeitura[cont] e entao eh verificado se esse valor eh diferente de EOF
	anelLeitura2[cont] = '\0';
	printf("\nLEITURA 1.2:%s\n",anelLeitura);// COISA ESTRANHA NAO E IMRPIMIDA ^^
	fclose(pTexto);
	pTexto = NULL;	
	printf("\nLEITURA 2.0%s\n",anelLeitura2);
	printf("\nLEITURA 1.3:%s\n",anelLeitura);// COISA ESTRANHA NAO E IMRPIMIDA ^^


	// outra alternativa é usar o comando e feof(). Esse comando e util , pois em arquivos binarios um inteiro no meio do arquivo pode ter o valor igual a  null
	// o que indicaria o fim do arquivo sem chegar no final do arquivo
	pTexto = NULL;
	pTexto = fopen("sauron.txt","r");
	if( pTexto == NULL ){
		printf("erro ao abrir o arquivo \n");
		exit(1);
	}
	printf("\nLEITURA 2.1%s\n",anelLeitura2);
	printf("\nLEITURA 1.4:%s\n",anelLeitura);// COISA ESTRANHA NAO E IMRPIMIDA ^^
	for( cont = 0 ; !feof(pTexto) ; cont++ ){ // feof() retorna 0, quando nao se esta no final do arquivo, e retorna algo diferente de 0 quando se esta no final
		anelLeitura3[cont] = fgetc(pTexto);
	}
	anelLeitura3[cont] = '\0';
	fclose(pTexto);
	pTexto = NULL;	
	printf("\nLEITURA 3:%s\n",anelLeitura3); 
	printf("\nLEITURA 1.5:%s\n",anelLeitura);// COISA ESTRANHA NAO E IMRPIMIDA ^^
	printf("\nLEITURA 2.2:%s\n",anelLeitura2);// COISA ESTRANHA NAO E IMRPIMIDA ^^
	
	return 0;
}

 

  • Obrigado 1

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...