Ir para o conteúdo
oliveira1991

Programa Biblioteca

Mensagens Recomendadas

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();
}

Editado por thoga31
GeSHi

Live for ever

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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;

Editado por pmg
Falta LP no GeSHi

Live for ever

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 ...

Editado por HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 ...

Editado por HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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);

Editado por oliveira1991

Live for ever

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação 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.