Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

oliveira1991

Programa Biblioteca

Recommended Posts

oliveira1991

Boa tarde,

Estou a fazer uma gestão de biblioteca, tenho um problema, quando estou a dar espaço entre palavras no registo de algum dado, o programa começa a escrever numeros e não faz o que foi solicitado.

Podem ajudar pff!

Obrigado

void registra(char nome[100], int ano, char editora[100] ) {
 FILE *fd;
 fd=fopen("BD_livro.txt","a"); /* criar ficheiro*/
 fprintf(fd, "%s\n", nome);
 fprintf(fd, "%d\n", ano);

 fprintf(fd, "%s\n", editora);
 printf("\n\tDados registrados!\n");
 fclose(fd);
 getchar();
}

Edited by thoga31
GeSHi

Live for ever

Share this post


Link to post
Share on other sites
HappyHippyHippo

apresenta o código que tens onde preenches os dados dos arrays/strings que estás a escrever no ficheiro


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

Share this post


Link to post
Share on other sites
oliveira1991

Sorry, coloqueio mal o codigo,

segue em baixo o codigo que estou a usar.

int main(void) {
FILE *fd;
int menu,ano;
char nome[100];

char editora[100];
while (menu!=0) {
limpa();
printf("\n\t Biblioteca\n");
printf("\n\t(1)\tRegistrar Livro.");
printf("\n\t(2)\tProcurar Livro.");
printf("\n\t(3)\tLista de Livros.");
printf("\n\t(4)\tLimpar Livro.");
printf("\n\t(5)\tSobre.");
printf("\n\n\t(0)\tSair.");
printf(" ");
scanf("%d",&menu);
getchar();
switch (menu) {
{
 case 1: {
 printf("\n\tEntre com o Nome: ");
 scanf("%s",&nome);


 printf("\n\tAno de edicao: ");
 scanf("%d",&ano);
 getchar();

 printf("\n\tEditora: ");
 scanf("%s",&editora);
 getchar();
 registra(nome, ano, editora);

 }
 } break;

Edited by pmg
Falta LP no GeSHi

Live for ever

Share this post


Link to post
Share on other sites
HappyHippyHippo

scanf não lê espaços entre palavras, para isso usa a função fgets

char nome[100];

if (!fgets(nome, 100, stdin))
{
 // erro de leitura
}


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

Share this post


Link to post
Share on other sites
oliveira1991

Boas, tentei o que me indicaram, em baixo o que eu fiz, mas continua na mesma, e agora ele quando dou o espaço e escreve a primeira string e depois dá um numero qualquer no ano de edição e a segunda string na editora!

case 1: {
    printf("\n\tQual o Nome: ");
   // scanf("%s",&nome);

    if (!fgets(nome,100,stdin))
    {
							   printf("Erro tente novamente");
							   }


Live for ever

Share this post


Link to post
Share on other sites
HappyHippyHippo

explica exactamente o que acontece (e não comas palavras)

de preferência, apresenta o output que é apresentado e o que era esperado apresentar, assim como o código actual


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

Share this post


Link to post
Share on other sites
oliveira1991

Exemplo se digitar,

lisboa nova

eis o output:

lisboa

2686828

ova

e apos dar enter ele não deixa colocar mais nada, apenas o nome do livro, e como se pode deparar, ele remove a primeira letra da segunda String

int main(void) {
 FILE *fd;
 int menu,ano;
 char nome[100];

 char editora[100];
 while (menu!=0) {
   limpa();
   printf("\n\t Biblioteca\n");
   printf("\n\t(1)\tRegistrar Livro.");
   printf("\n\t(2)\tProcurar Livro.");
   printf("\n\t(3)\tLista de Livros.");
   printf("\n\t(4)\tLimpar Livro.");
   printf("\n\t(5)\tSobre.");
   printf("\n\n\t(0)\tSair.");
   printf(" ");
   scanf("%d",&menu);
   getchar();
   switch (menu) {
   {
     case 1: {
       printf("\n\tQual o Nome: ");


       if (!fgets(nome,100,stdin))
       {
          printf("Erro tente novamente");
       }
       //  scanf("%s",&nome);

       printf("\n\tAno de edicao: ");
       scanf("%d",&ano);
       getchar();

       printf("\n\tEditora: ");
       scanf("%s",&editora);
       getchar();
       registra(nome, ano, editora);

     }
     } break;


Live for ever

Share this post


Link to post
Share on other sites
HappyHippyHippo

eu quando pedi o output pedi tudo que é apresentado na consola (seja tu, o programa ou o sistema operativo a escrever)

ps : por outras palavras : faz copy paste da consola ...

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other sites
HappyHippyHippo

se o teu código é o que apresentaste, indenta o código correctamente e diz se não verificas nenhum problema

ps : olha bem para o scanf da editora ...

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other sites
oliveira1991

Boas tardes,

Tenho estado a tentar fazer de tudo para a resolução deste programa mas até agora ainda não consegui descobrir o erro, peço que me dêem uma luz!!


Live for ever

Share this post


Link to post
Share on other sites
pmg

Quando usas "%s" no scanf, esse "%s" nao 'apanha' espacos.

Se o nome da editora for "Editora Nova" o scanf para no espaco (que e apanhado com o getchar()) ficando "Nova" no input para o ano de edicao!

Sugestao: nao uses scanf() para input do utilizador. Prefere fgets() e tratamento posterior da string.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
oliveira1991

Boas,

Já tentei o seguinte código apos o printf, mas não esta a resultar

fgets(nome, 100, stdin);


Live for ever

Share this post


Link to post
Share on other sites
oliveira1991

printf("\n\tQual o nome do Livro: ");
fgets(nome, 100, stdin);

apenas estou com este código para registar o nome do livro.


Live for ever

Share this post


Link to post
Share on other sites
HappyHippyHippo

printf("\n\tQual o nome do Livro: ");
fgets(nome, 100, stdin);

apenas estou com este código para registar o nome do livro.

isso já tinhas dito, eu disso para apresentares "o código"

já que estás renitente em apresentar, ao menos indica o que queres dizer com :

mas não esta a resultar


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

Share this post


Link to post
Share on other sites
oliveira1991

mas o código eu já o apresentei completo em cima, apenas coloquei

fgets(nome, 100, stdin);

, não esta a resultar porque não esta a ler a string completa!


Live for ever

Share this post


Link to post
Share on other sites
HappyHippyHippo

se continuas com o código acima, então :

se o teu código é o que apresentaste, indenta o código correctamente e diz se não verificas nenhum problema


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

Share this post


Link to post
Share on other sites
oliveira1991

Lá esta, eu ainda ando ando a tentar perceber disto, dai não perceber aonde esta o erro!


Live for ever

Share this post


Link to post
Share on other sites
HappyHippyHippo

ok, então indento eu o código por ti:

int main(void) {
 FILE *fd;
 int menu,ano;
 char nome[100];

 char editora[100];
 while (menu!=0) {
   limpa();
   printf("\n\t Biblioteca\n");
   printf("\n\t(1)\tRegistrar Livro.");
   printf("\n\t(2)\tProcurar Livro.");
   printf("\n\t(3)\tLista de Livros.");
   printf("\n\t(4)\tLimpar Livro.");
   printf("\n\t(5)\tSobre.");
   printf("\n\n\t(0)\tSair.");
   printf(" ");
   scanf("%d",&menu);
   getchar();
   switch (menu) {
   {
     case 1:
     {
       printf("\n\tQual o Nome: ");


       if (!fgets(nome,100,stdin))
       {
          printf("Erro tente novamente");
       } // <---- fim do if
       //  scanf("%s",&nome);

       printf("\n\tAno de edicao: ");
       scanf("%d",&ano);
       getchar();

       printf("\n\tEditora: ");
       scanf("%s",&editora);
       getchar();
       registra(nome, ano, editora);

     } // <---- fim do case
   } // <---- fim do switch
   break; // <--- que é isto ?


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

Share this post


Link to post
Share on other sites
oliveira1991

Boas,

Penso ter resolvido o programa, so uma pequena questão quando o programa escreve no ficheiro ele dá um fica com um espaço em branco entre as strings, essa situação é normal acontecer.

em baixo o código que estou a usar.

switch (menu) {
{
  case 1: {
printf("\n\tQual o Nome: ");
	fgets(nome, 100, stdin); // utilizador introduz o nome do livro

 printf("\n\tAno de edicao: ");
 fgets(ano, 20, stdin); // utilizador introduz o ano  da edição

	printf("\n\tEditora: ");
 fgets(editora, 100, stdin); // utilizador introduz o nome da editora,

 registra(nome, ano, editora);
	}
  } break;

sorry resolvido usei apenas o gets

assim:

gets(ano);

Edited by oliveira1991

Live for ever

Share this post


Link to post
Share on other sites
pmg

É normal, mas normalmente esse espaco extra remove-se.

O que acontece é que o fgets() guarda o ENTER na string.

Pode-se tirar esse ENTER logo a seguir:

fgets(ano, 20, stdin);
ano[strlen(ano) - 1] = 0; // remover ENTER


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
HappyHippyHippo

viste (sequer) o teu código indentado no meu post ? leste os comentários ?


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

Share this post


Link to post
Share on other sites
oliveira1991

viste (sequer) o teu código indentado no meu post ? leste os comentários ?

sim li, só que continuo sem perceber o porque, ou qual o objectivo?.

so uma outra questão, qual a função que se usa para mostrar o que esta num ficheiro? visto que o scanf não le os espaço o que posso usar?


Live for ever

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

×

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.