Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Vanilson

[Resolvido] Escrever e mostrar dados de um ficheiro

Recommended Posts

Galera tudo bem, bem galera eu estou a tentar escrever dados em um ficheiro e ao mesmo tempo mostrar, ele não apresenta erro mais imprimi um numero estranho, ai vai o codigo:

Este é o codigo do cabeçarop(estrut_pessoa.h)

#ifndef ESTRUT_PESSOA_H
#define ESTRUT_PESSOA_H
typedef struct pessoa
{
	int nr_conta[10];
	char beneficiario[100];
	char morada[100];
	float valor;
	int data;
}PESSOA;
void inserir_dados(PESSOA*d);
#endif

#ifndef ESTRUT_PESSOA_H
#define ESTRUT_PESSOA_H
typedef struct pessoa
{
	int nr_conta[10];
	char beneficiario[100];
	char morada[100];
	float valor;
	int data;
}PESSOA;
void inserir_dados(PESSOA*d);
#endif
Esta é a função que vai inserir os dados no ficheiro

FILE *fp;
char file_nrconta[100]="nr_conta.dat";
void inserir_dados(PESSOA*d)
{
	printf("Introduza o NUMERO DA CONTA: ");
	scanf("%d",&d->nr_conta);
	fp=fopen(file_nrconta,"a+b");
	if(fp==NULL)//Verificando se a abertura do ficheiro foi feita com sucesso
	{
		printf("Nao foi possivel abrir o ficheiro %s","nr_conta.dat");
		exit(1);
 	}
	fwrite(d->nr_conta,sizeof(PESSOA),1,fp); 
	fread(d->nr_conta,sizeof(PESSOA),1,fp);
	printf("%d",d->nr_conta);		
}
Não coloquei ele a pedir o restante dos dados pq logo q detectei que ele não estava a mostrar os dados de forma correcta decidi resolver primeiro este erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que o erro tá aqui:

 

scanf("%d", &d->nr_conta);

 

O segundo parametro do scanf espera um endereço pra guardar o valor de %d, mas você tá passando o endereço do ponteiro. como d é um ponteiro (já aponta pra um endereço), você pode tirar o &

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem muitos erros ai...

pq você declarou "fp" como global?

 

você abre fp, mas não fecha.... e creio que abre outra vez (em uma segunda chamada à função "inserir_dados") com o arquivo ja aberto...

 

scanf("%d", &d->nr_conta)...

você quer guardar um inteiro num array de inteiros?

sinto informar, mas não dá certo... xD

 

scanf("%d", &(d->nr_conta[0])); e você vai guardar o valor na primeira "casa" do array "nr_conta".

-----------------------------------------------

 

como d é um ponteiro [...]

Mas não interessa o que "d" é.. interessa o que "d->nr_conta" é, nesse caso... um ponteiro para um array de inteiros.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Victor realmente o fp não precisa de ser uma variavel global, distração minha, entao o nr_conta não coloquei como array pq 100 é o meu numero de caracteres...alterei o code da função inserir_dados e ele ficou assim:

 

void inserir_dados(PESSOA *d)
{
	FILE *fp;
	printf("Introduza o NUMERO DA CONTA: ");
	scanf("%d",&d->nr_conta);
	fp=fopen(file_nrconta,"a+b");
	if(fp==NULL)//Verificando se a abertura do ficheiro foi feita com sucesso
	{
		printf("Nao foi possivel abrir o ficheiro %s","nr_conta.dat");
		exit(1);
 	}
	fwrite(&d->nr_conta,sizeof(struct pessoa),1,fp); 
	fread(&d->nr_conta,sizeof(struct pessoa),1,fp);
	printf("%d",d->nr_conta);
	   fclose(fp);		
}

Ao fazer o teste, caso eu digitar 1 por exemplo o numero que ele me apresenta é 2293232

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas não interessa o que "d" é.. interessa o que "d->nr_conta" é, nesse caso... um ponteiro para um array de inteiros.

Se você tem uma array

int teste[10];

 

então 'teste' ---> '&teste[0]'

 

Exemplo:

int x[3];

int *ptr;

ptr = x; //ptr recebe o endereço da primeira posição do vetor, o mesmo que ptr = &x[0];

 

Uma array nada mais é que um ponteiro usando o operador [] pra acessar os bytes seguintes.

No caso dele, o scanf tava sobrescrevendo direto o endereço do ponteiro que apontava pro ponteiro do array (putz, agora nem eu me entendi...).

 

Mas no final a lógica tava errada mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal é o seguinte, eu estive verificando e vi que ele está inserir no ficheiro mais ele esta a inserir aquele numero que eu disse quando digita-se 1 que é o 2293232. Alguem sabe o pq q ele está a inserir este numero em vez do numero que eu digitei.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vanilson, você está gravando um ficheiro em modo BINÁRIO...

Não vai conseguir ler como texto nunca...

será que não é isso?

Dê um exemplo de um input/output desejado.

 

fwrite(&d->nr_conta,sizeof(struct pessoa),1,fp);
fread(&d->nr_conta,sizeof(struct pessoa),1,fp);
Você escreveu no arquivo... no final dele...

e quer ler de onde?

se eu não me engano, você vai ler (sizeof(struct pessoa) * 1) bytes a partir do ponteiro do arquivo.

Se o ponteiro do arquivo está depois dos dados que você quer ler, não lerá nada

 

Mnemonic

 

Sim cara,

No caso dele, o scanf tava sobrescrevendo direto o endereço do ponteiro que apontava pro ponteiro do array

e eu volto a dizer, não interessa o que "d" é (qual o tipo de "d")... interessa o tipo de: "d->nr_conta" entendeu?

Se "d" é uma estrutura, union, ponteiro, peixe, bola de futebol.... etc.... o scanf não ta preocupado.

você só reforçou o que eu disse.

 

e é ai que entra o uso de prenteses... e como são importantes quando estamos a programar!

(&d)->nr_conta é diferente de &(d->nr_conta) !!!!

 

E o operador [] nada mais é do que a soma de sizeof(tipo_do_array) ao ponteiro inicial...

array[4] é o mesmo que *(array + 4)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você escreveu no arquivo... no final dele...

e quer ler de onde?

Victor, eu quero ler no mesmo arquivo

 

Se o ponteiro do arquivo está depois dos dados que você quer ler, não lerá nada

Não compreendi essa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vanilson... vamos imaginar um arquivo aberto: FILE *f = fopen("arquivo", "ab+");

Ao executar a operação:

fwrite(&inteiro, sizeof(int), 1, f);

O nosso arquivo estará assim:

****|

(onde "|" é o ponteiro atual do arquivo.... isto é.. qualquer operação é feita a partir dele. e "*" são bytes escritos no arquivo, nota: um integer tem 4 bytes na maioria das plataformas)

 

se você tentar ler o aruivo em seguida:

fread(&inteiro, sizeof(int), 1, f);

ele vai tentar ler 4 bytes, uma vez, A PARTIR da posição atual do ponteiro do arquivo.

Note que não há nada depois do ponteiro do arquivo...

precisamos "rebobinar" o arquivo...

faça um rewind(f), e então o arquivo ficará:

|****

 

Agora você consegue ler 4 bytes.

 

Mas a pergunta que não quer calar...

você escreveu "d->nr_conta" no arquivo, por que raios você quer ler ele em seguida? Sendo que você ja sabe o valor dele....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas a pergunta que não quer calar...

você escreveu "d->nr_conta" no arquivo, por que raios você quer ler ele em seguida? Sendo que você ja sabe o valor dele....

Victor, eu quero ler ele para saber se ele inseriu mesmo esse valor ou não no ficheiro

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vanilson, você está gravando um ficheiro em modo BINÁRIO...

Não vai conseguir ler como texto nunca...

Eu sei que não irei conseguir ler nunca o q esta no ficheiro, o q eu estou na duvida é quando ele insere, e eu vou ver o que esta no arquivo ele insere uns caracteres estranhos...é assim q deve ser mesmo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara...

se a função fwrite retornar o mesmo que você passar no parametro "count" você não precisa abrir o arquivo pra ver se gravou, pq com certeza gravou.

E se você está gravando em um arquivo como binário... meu, esquece... não vai dar pra ler como texto nunca, aparecerão os tais caractéres estranhos que você disse...

 

Imagina o número: 3045

em binário (com sizeof(int) bytes): 00000000 00000000 00001011 11100101

se eu quiser separar em quatro chars, vou obter:

 

00000000

00000000

00001011

11100101

 

(em decimal: 0 0 11 229... você vai obter a represantação ASCII desses números)

 

Entendeu da onde vem os caracteres estranhos???

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.