Jump to content

printf de uma estrutura


alphasil
 Share

Recommended Posts

Oi pessoal

Tenho um código que imprime uma estrutura guardada num ficheiro mas que imprime em linhas diferentes e eu queria tudo na mesma linha.

tenho um printf que faz

Nome Nickname Pass Log

e o printf do ficheiro é

fread(&j, sizeof j, 1, f);
printf("Existem %d jogadores registados\n", reg);
printf("\nNome	   |Nickname	   |Password	   |Log\n");
printf("%s %s %s  %d \n",j.nome, j.nick, j.pass, j.log);
printf ("*=============================================================================*\n");

Mas aparece-me assim

ric

ricky

teste

0

Como se pode ter tudo na mesma linha??

cumps

gmc11

 

Link to comment
Share on other sites

isso deveria de imprimir tudo na mesma linha... 😕

nao deves ter o "\n" nas variaveis?

faz um print das variaveis e posta o resultado aqui!

printf("%s\n",j.nome);
int i=0;
for(i=0;i<strlen(j.nome);i++)
{
 printf("%d - %d\n",i,j.nome[i]);
}

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

Link to comment
Share on other sites

pois, como eu pensava, o tua variavel tem um \n antes do \0, mete aqui o codigo que estas a fazer para atribuir o valor ao nome

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

Link to comment
Share on other sites

Oi

Não vejo nenhum \n no print 😞

int listarJog()
{
   struct jogador j;
FILE *f;
int reg=0;
if ((f= fopen("registos.dat", "rb")) == NULL)
{
 printf("Erro ao abrir ficheiro\n");
}
fseek(f, 0, SEEK_END);
   reg=ftell(f) /sizeof j;
   fseek(f, 0 , SEEK_SET);
printf ("\n*=============================================================================*\n");
   printf ("|					   >>>>Visualizacao de jogadores<<<<					  |\n");
   printf ("*=============================================================================*\n");
   printf ("																			   \n");
fread(&j, sizeof j, 1, f);
printf("Existem %d jogadores registados\n", reg);
printf("\nNome	   |Nickname	   |Password	   |Log\n");
printf("%s %s %s  %d ",j.nome, j.nick, j.pass, j.log);
printf ("*=============================================================================*\n");
fclose(f);
return 0;
}

Obrigado

gmc11

 

Link to comment
Share on other sites

mete aqui o ficheiro de txt

Oi

Não vejo nenhum \n no print 😞

Oi

Com o código que postaste tenho isso.

Ric

0 - 71

1 - 105

2 - 108

3 - 10

O codigo que te dei, e' para imprimir o codigo ASCII, o valor 10="\n"

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

Link to comment
Share on other sites

O '\n' não está no printf mas sim na string que tu lês do ficheiro. Provavelmente a primeira vez que introduzes um jogador estás a copiar o \n para os campos da struct. Ao gravares no ficheiro isso vai junto. Ao imprimires aí ele imprime os \n porque fazem parte das strings.

Link to comment
Share on other sites

Isso é a função de listar. Como o pikax disse, insere a função onde estás a atribuir o valores às variáveis e que depois inseres no ficheiro...

ele esta' a usar ficheiros: fread(&j, sizeof j, 1, f);

EDIT: mete o codigo em que gravas para o ficheiro: fwrite

e tambem o codigo que adicionas um jogador

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

Link to comment
Share on other sites

Ok

Função registar (faz tudo, adiciona e grava)

void registo()
{
struct jogador j;
char usr[30];
int op, reg, flag=0;
FILE *f;
if ((f = fopen("registos.dat", "a+b")) == NULL)
{
	printf("Erro ao abrir ficheiro\n");
}
else
{
	printf ("\n*=============================================================================*\n");
 printf ("|					   >>>>Insercao de jogadores<<<<						 |\n");
 printf ("*=============================================================================*\n");
 printf ("																			   \n");
//Lê do teclado e grava no ficheiro
	fseek(f,0, SEEK_END);
 reg=ftell(f) /sizeof j;
 fseek(f,0,SEEK_SET);
 rewind(f);
 printf("\n			  nExistem %d jogadores registados\n", reg);
	printf("\n  Introduza o seu nome \n");
	fgets(j.nome, 30, stdin);
	printf("\n  Introduza o seu nickname: \n");
	fgets(usr,200, stdin);
	rewind(f);
	while (fread(&j,sizeof j,1,f)==1)
	{
		if(strcmp(j.nick,usr)==0)
		{
			flag=1;
			break;
		}
	}
	if(flag==1 || strlen(usr)<2)
	{
		printf("Este nick ja esta em uso...\n");
		printf("Escolha agora outro...\n");
		fgets(j.nick, 29, stdin);
	}
	printf("Introduza a sua pass (palavras)\n");
	fgets(j.pass, 29, stdin);
	strcpy(j.nick,usr);
	fwrite(&j, sizeof j, 1 , f);
	fclose(f);
}
printf("Quer registar outro jogador? (1-Sim / 2- Nao) \n");
scanf("%d", &op);
getchar();
if (op==1)
{
	registo();
}
else if (op==2)
{
	system("cls");
	menu_principal();
}
else
{
	exit(1);
}
}
gmc11

 

Link to comment
Share on other sites

Provavelmente no fgets está a ficar o \n. Podes forçar e a atribuir um \0 na posição strlen-1 ou na strcpy usa em vez a strncpy e copia apenas strlen-1 caracteres...

EDIT: Ou usa apenas o gets(Muito desaconselhado!).

Edited by KiNgPiTo
Link to comment
Share on other sites

47 69 6C 0A

Estes são os teus primeiros 4 Bytes do ficheiro. Traduzindo: 'G' 'i' 'l' '\n'

Como estás a ver o '\n' já vem do ficheiro. Como os outros disseram, o melhor é "sacares o '\n' quando lês os campos do teclado. Outra hipótese para isso é fazeres um sscanf sobre a string que leste com o fgets, filtrando o '\n' :

Edited by Flinger
Link to comment
Share on other sites

usa o fscanf(stdin,"%[^\n]",j.nome); e para os demais

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

Link to comment
Share on other sites

Então resolvo isso como?


printf("%s\n",j.nome);
int i=0;
for(i=0;i<strlen-1(j.nome);i++)
{
 printf("%d - %d\n",i,j.nome[i]);
}

Ou seja mando imprimir o campos todos -1 (carater) é isso?

Ou no ficheiro de gravação uso o fscanf?

Edited by alphasil
gmc11

 

Link to comment
Share on other sites

Isso já começa a ser muita areia para o meu carrinho 😛 :P 😛

Se estou a perceber sigo isso

printf("\n  Introduza o seu nome \n");
fgets(auxiliar, 30, stdin);
sscanf(auxiliar,"%[^\n]",,j.nome);

Será algo assim?

Edited by alphasil
gmc11

 

Link to comment
Share on other sites

De volta

Certíssimo, já aparece tudo na mesma linha,

Uma última coisa, neste ficheiro tem um campo "log" que só pode ser gravado no fim de um jogo e não de um registo, basta abrir o ficheiro e acrescentar

fwrite(&log, sizeof j, 1 f);

??

Obrigado a todos

gmc11

 

Link to comment
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
 Share

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