programa em C dá erro

Master_piece

Power Member
Estou aqui a fazer um programa que me dá um certo jeito e proveito para estudar C, visto que tenho andado a estudar pelo livro "Linguagem C" de Luis Damas.

O programa ainda não está acabado mas só para experimentar o que ja está feito compileio e ao executalo quando chega á parte de pedir um jogo na função add_jogo() eu coloco o jogo e depois dá erro. Suponho que seja na fprintf(), mas não sei qual é o problema.
Código:
#include <stdio.h>
#include <stdlib.h>

add_jogo()
{
     FILE *jg;
     char jogo;
     printf("Nome do jogo: ");
     scanf(" %c",&jogo);
     fprintf(jg,"%c",jogo);
     }



int main()
{
  FILE *pp, *jg;
  int mmenu, menu;
  pp = fopen("pessoal.txt","a+");
  jg = fopen("jogos.txt","a+");  
    
  printf(">>>O que deseja fazer?<<<\n\n");
  printf("1:adicionar jogo.\n");
  printf("2:adicionar participante.\n");
  printf("3:ver participantes.\n");
  printf("4:ver jogos.\n");
  printf("5:sair\n\n");
  
  scanf("%d",&mmenu);
  
  switch(mmenu)
  
      case 1 : add_jogo();
      /*case 2 : " ";
      case 3 : " ";
      case 3 : " ";
      case 4 : " ";
      case 5 : exit(1) ;*/
       
  fclose(pp);
  fclose(jg);
}

Ajudem-me é que ainda não percebo assim muito disto visto que ainda ando a estudar isto(apenas com apoio deste livro e da internet).

Cumps.
Master
</div>
 
Última edição pelo moderador:
Na função add_jogo não abriste o ficheiro para escrita.

jg = fopen("nomedofixeiro","w");


LoL

Não sabia que tinha que abrir o ficheiro para escrita.
xD.

Obrigado

Ja agora então não necessito de abrir os ficheiros para escrita e leitura em main, pois essas operações vão ser todas realizadas por funções criadas por mim e chamadas em main.?

E mais uma coisa com o
Código:
scanf(" %c",&jogo);
apenas consigo enviar um caracter, e eu pretendia enviar um nome comleto, como por exemplo Cs ou Rise of Nations, etc.
 
Última edição pelo moderador:
Desculpem la tar outra ves a incomodar, mas depois de ter o programa completo, deparome com o mesmo erro que me deparava inicialmente, e não estou a ver do que possa ser.

Código:
#include <stdio.h>
#include <stdlib.h>

mmenu()
  {
  system("cls"); 
  int m;
  
  printf(">>>O que deseja fazer?<<<\n\n");
  printf("1:adicionar jogo.\n");
  printf("2:adicionar participante.\n");
  printf("3:ver jogos.\n");
  printf("4:ver participantes.\n");
  printf("qualquer outra tecla para sair\n\n");
  
  scanf(" %d",&m);
  
  switch(m)
  {
      case 1 : add_jogo();
      case 2 : add_participante();
      case 3 : ver_jogos();
      case 4 : ver_participantes();
      default : exit(1);         
  }       
}

sm1()     
{    
     int j; 
     printf("1:adicionar outro jogo.");
     printf("2:voltar ao menu principal.");
     printf("qualquer outra tecla para sair\n\n.");
     
     scanf(" %d",&j);
     
     switch(j)
     {
          case 1 : add_jogo();
          case 2 : mmenu();
          default : exit(1);
     }    
     }
     
sm2()     
{    
     int p; 
     printf("1:adicionar outro participante.");
     printf("2:voltar ao menu principal.");
     printf("qualquer outra tecla para sair\n\n.");
     
     scanf(" %d",&p);
     
     switch(p)
     {
          case 1 : add_participante();
          case 2 : mmenu();
          default : exit(1);
     }     
     }
     
sm3()     
{    
     int aj; 
     printf("1:voltar ao menu principal.");
     printf("qualquer outra tecla para sair\n\n.");
     
     scanf(" %d",&aj);
     
     switch(aj)
     {
          case 1 : mmenu();
          default : exit(1);
     }    
     }     
     
add_jogo()
{
     system("cls");
     FILE *jg;
     char jogo;
     jg = fopen("jogos.txt","a");
     printf("Nome do jogo: ");
     scanf(" %[^\n]%c",&jogo);
     fprintf(jg,"%c\n",jogo);
     fclose(jg);
     sm1();
}

add_participante()
{
     system("cls");         
     FILE *pp;
     char man;
     pp = fopen("participantes.txt","a");
     printf("Nome do participante: ");
     scanf(" %[^\n]c",&man);
     fprintf(pp,"%c\n",man);
     fclose(pp);
     sm2();    
     }
     
ver_jogos()
{
     system("cls");           
     FILE *jg;
     char jogo;
     jg = fopen("jogos.txt","a");
     while ((jogo=fgetc(jg)) !=EOF)
           putchar(jogo);
     fclose(jg);
     sm3();
     }        

ver_participantes()
{
     system("cls");                   
     FILE *pp;
     char man;
     pp = fopen("participantes.txt","a");
     while ((man=fgetc(pp)) !=EOF)
           putchar(man);
     fclose(pp);
     sm3();
     }        

int main()
{
    int m;
  mmenu();
}

Cumps.
Master
</div>
 
Última edição pelo moderador:
Tens aí uma série de falhas de estruturação do código:

1) Os teus "cases" vão ser invocados todos sequencialmente a partir do case de entrada, porque não estás a colocar a instrução break no fim de cada um.
2) Não se deve usar a função exit(int) por tudo e por nada. O parâmetro desta função é um inteiro que permite comunicar ao SO a ocorrência de determinado estado da aplicação ou de algum erro.
3) Todas essas invocações de funções dentro de outras funções para fazer o efeito "retroceder" podem ser substituídas por um simples ciclo "do...while" com a ajuda dos tais breaks nos cases.
4) As tuas funções não têm tipo de retorno. Sendo assim, o compilador assume que o seu tipo de retorno é int. No entanto não há nenhuma instrução de return no código. Convinha que o seu tipo fosse void (não retorna nada).
5) Estás a usar uma chamada ao SO através do código system(...). Isso vai fazer com que o teu programa fique dependente do SO no qual estás a programar e, portanto, não se torna portável.
6) Não estás a testar a hipótese de falha na abertura de ficheiros.
 
Estive a ver o codigo, tenho ideia que nos switchs no fim do código de cada case é preciso adicionar um break, por exemplo:

Código:
  switch(m)
  {
      case 1: 
          add_jogo();
      break;
      case 2: 
          add_participante();
      break;
      case 3: 
          ver_jogos();
      break;
      case 4:
          ver_participantes();
      break;
      default: 
          exit(1);         
  }

Na função add_jogo() no scanf estás a atribuir uma string(vários caracteres) à char jogo que consiste em apenas 1 caracter. Deves então declara-la como char *jogo ou char jogo[256].
 
Back
Topo