Jump to content
Sign in to follow this  
MacgyverPT

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

Recommended Posts

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

Edited by M.offspring.R

Share this post


Link to post
Share on other sites
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;
}

Edited by HappyHippyHippo
  • Vote 1

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

Share this post


Link to post
Share on other sites
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--
}

Edited by 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."

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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!

Share this post


Link to post
Share on other sites
MacgyverPT

Eu ainda sou do tempo em que uma duvida era esclarecida se podia bloquear os topics :P

A idade já não vai perdoando...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.