Vanilson 2 Denunciar post Postado Julho 3, 2009 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); #endifEsta é 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
Mnemønic 0 Denunciar post Postado Julho 3, 2009 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
VictorCacciari 42 Denunciar post Postado Julho 3, 2009 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
Vanilson 2 Denunciar post Postado Julho 3, 2009 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
Mnemønic 0 Denunciar post Postado Julho 3, 2009 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
Vanilson 2 Denunciar post Postado Julho 3, 2009 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
VictorCacciari 42 Denunciar post Postado Julho 3, 2009 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
Vanilson 2 Denunciar post Postado Julho 4, 2009 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
VictorCacciari 42 Denunciar post Postado Julho 4, 2009 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
Vanilson 2 Denunciar post Postado Julho 4, 2009 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
VictorCacciari 42 Denunciar post Postado Julho 4, 2009 http://www.cplusplus.com/reference/clibrary/cstdio/fwrite/ Leia a documentação da função fwrite... especialmente a parte "return type" Compartilhar este post Link para o post Compartilhar em outros sites
Vanilson 2 Denunciar post Postado Julho 4, 2009 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
VictorCacciari 42 Denunciar post Postado Julho 4, 2009 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
Vanilson 2 Denunciar post Postado Julho 5, 2009 Compreendi Victor, e graças as tuas dicas consegui superar o erro. Compartilhar este post Link para o post Compartilhar em outros sites