alphasil Posted June 19, 2012 Report Share Posted June 19, 2012 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 More sharing options...
pikax Posted June 19, 2012 Report Share Posted June 19, 2012 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 More sharing options...
alphasil Posted June 19, 2012 Author Report Share Posted June 19, 2012 Oi Com o código que postaste tenho isso. Ric 0 - 71 1 - 105 2 - 108 3 - 10 ??? gmc11 Link to comment Share on other sites More sharing options...
pikax Posted June 19, 2012 Report Share Posted June 19, 2012 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 More sharing options...
alphasil Posted June 19, 2012 Author Report Share Posted June 19, 2012 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 More sharing options...
pikax Posted June 19, 2012 Report Share Posted June 19, 2012 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 More sharing options...
Flinger Posted June 19, 2012 Report Share Posted June 19, 2012 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 More sharing options...
KiNgPiTo Posted June 19, 2012 Report Share Posted June 19, 2012 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... Link to comment Share on other sites More sharing options...
alphasil Posted June 19, 2012 Author Report Share Posted June 19, 2012 Oi O ficheiro é um ficheiro dat gravado com fwrite. Saca por aí http://www.mrealest.com/ppt/registos.dat Obrigado gmc11 Link to comment Share on other sites More sharing options...
pikax Posted June 19, 2012 Report Share Posted June 19, 2012 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 More sharing options...
alphasil Posted June 19, 2012 Author Report Share Posted June 19, 2012 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 More sharing options...
KiNgPiTo Posted June 19, 2012 Report Share Posted June 19, 2012 (edited) 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 June 19, 2012 by KiNgPiTo Link to comment Share on other sites More sharing options...
Flinger Posted June 19, 2012 Report Share Posted June 19, 2012 (edited) 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 June 19, 2012 by Flinger Link to comment Share on other sites More sharing options...
pikax Posted June 19, 2012 Report Share Posted June 19, 2012 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 More sharing options...
alphasil Posted June 19, 2012 Author Report Share Posted June 19, 2012 (edited) 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 June 19, 2012 by alphasil gmc11 Link to comment Share on other sites More sharing options...
Flinger Posted June 19, 2012 Report Share Posted June 19, 2012 usa o fscanf(stdin,"%[^\n]",j.nome); e para os demais Ou les com o fgets para uma str auxiliar e depois sscanf(auxiliar,"%[^\n]",,j.nome); Assim manténs a protecção que o fgets te dá sobre o tamanho do buffer. Link to comment Share on other sites More sharing options...
alphasil Posted June 19, 2012 Author Report Share Posted June 19, 2012 (edited) 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 June 19, 2012 by alphasil gmc11 Link to comment Share on other sites More sharing options...
Flinger Posted June 19, 2012 Report Share Posted June 19, 2012 Yep. Link to comment Share on other sites More sharing options...
alphasil Posted June 19, 2012 Author Report Share Posted June 19, 2012 Ok, vou testar a ver, já digo alguma coisa, obrigado a todos gmc11 Link to comment Share on other sites More sharing options...
alphasil Posted June 19, 2012 Author Report Share Posted June 19, 2012 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now