Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

MacgyverPT

[Resolvido][Duvida] Guardar em binário a estrutura de um ficheiro .txt

Mensagens Recomendadas

MacgyverPT    1
MacgyverPT

Boas.

Estou encalhado com uma coisa que não consigo resolver. Já fiz bastantes pesquisas mas sem sucesso (ha alguma coisa que me escapa)...

Tenho a seguinte função (sim eu sei que é básica mas serve perfeitamente):

void salvarJogoTXT(struct Jogador *jogador, struct Adversario *adversario){
 FILE *f;
 f = fopen("..\\Debug\\saveGame.txt","w");

 if (f != NULL){
fprintf(f, "%s\n", jogador->jogadorNome);
fprintf(f, "%d\n", jogador->jogadorEnergia);
fprintf(f, "%d\n", jogador->jogadorPosicao);
fprintf(f, "%d\n", adversario->adversarioEnergia);
fprintf(f, "%d\n", adversario->adversarioPosicao);
 }

 fclose(f);
}

E queria gravar, em vez de .txt ser em ficheiro binário (exemplo .dat).

Tentei fazer, e no primeiro campo (jogadorNome), tem o tamanho de 20, se eu meter um nome com 3 caracteres, ele guarda-me no ficheiro esse nome legível + 17 caracteres "estranhos"...

Alguém me pode dar uma ajudinha?

Cump.

MoffspringR

Editado por M.offspring.R

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

E queria gravar, em vez de .txt ser em ficheiro binário (exemplo .dat).

f = fopen("..\\Debug\\saveGame.dat","w");
//                              A
//                              |
//                      basta mudar o nome ...

alem disso, deveria abrir o ficheiro como binário. isto é, as flags de abertura do ficheiro deveriam ser "wb" e não "w"

Tentei fazer, e no primeiro campo (jogadorNome), tem o tamanho de 20, se eu meter um nome com 3 caracteres, ele guarda-me no ficheiro esse nome legível + 17 caracteres "estranhos"...

pois ... o problema é que estas a gravar a string resultado de um printf.

e vais ver agora como é milhentas vezes mais simples do que ficheiros de texto:

int salvarJogoBin(struct Jogador *jogador, struct Adversario *adversario){
 FILE *f;

 if ((f = fopen("..\\Debug\\saveGame.txt","wb")) == NULL){ {
   return -1;
 }

 fwrite(jogador, sizeof(struct Jogador), 1, f);
 fwrite(adversario, sizeof(struct Adversario), 1, f);

 fclose(f);
 return 0;
}

int recuperarJogoBin(struct Jogador *jogador, struct Adversario *adversario){
 FILE *f;

 if ((f = fopen("..\\Debug\\saveGame.txt","rb")) == NULL){ {
   return -1;
 }

 fread(jogador, sizeof(struct Jogador), 1, f);
 fread(adversario, sizeof(struct Adversario), 1, f);

 fclose(f);
 return 0;
}

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pikax    159
pikax
Tentei fazer, e no primeiro campo (jogadorNome), tem o tamanho de 20, se eu meter um nome com 3 caracteres, ele guarda-me no ficheiro esse nome legível + 17 caracteres "estranhos"...

Em C, uma "string" e' um array de caracteres com um tamanho fixo, mas C nao sabe qual e' o tamanho dele(a nao ser que seja tamanho estatico).

em C uma "string" acaba quando tem o caracter \0 o resto para a frente nao interessa. Se nao gostas do lixo, podes fazer algo assim:

char arr[20];
char clean[20];
memset(clean,'\0',sizeof(clean));

strcpy(arr,"asd");
memcpy(arr,clean,strlen(arr)+1);

acho que assim possa funcionar, nao testado.

EDIT: Codigo em baixo, testado:

#include<stdio.h>
int main()
{
int i=0;
char arr[20];
char clean[20];
memset(clean,'\0',sizeof(clean)+1);

strcpy(arr,"P@P");

strcpy(clean,arr);

printf("\narr:");
for(i=0;i<20;i++)
	printf("%c",arr[i]);

printf("\nclean:");
for(i=0;i<20;i++)
	printf("%c",clean[i]);

scanf("%s",arr); //wait--
}

Editado por pikax

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
MacgyverPT    1
MacgyverPT

Obrigado. Já deu para perceber um pouco mais.

Ainda não está a funcionar a 100% a leitura do binário, mas eu ja vou descobrir como se faz. Tenho que dar volta a isto!!

Podem bloquear o topic.

Obrigado.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
thoga31    594
thoga31

Podem bloquear o topic.

Obrigado.

Já devias saber, com 1935 posts, que no P@P os tópicos não são bloqueados a não ser, claro, que violem as regras :P


Knowledge is free!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.