Jump to content
Fórum Script Brasil
  • 0

Segmentation Fault - Ajuda?


Caladan

Question

Oi gente,

obrigado primeiro de tudo por ter vindo ver meu tópico

Preciso de ajuda com este programa -

#include <stdio.h>
#include <stdlib.h>



    mostrar_menu ()
    {    
        char opcao;
        
        puts("\n\tViaturas? É comigo!\n");
        puts("0 - Sair do programa");
        puts("1 - Ler o ficheiro de texto");
        puts("2 - Mostrar todas as marcas");
        puts("3 - Mostrar o preço de uma viatura");
        puts("4 - Escrever dados num ficheiro de texto\n");
        puts("5 - Mostrar modelos de uma marca");
        puts("6 - Mostrar preço de uma viatura específica");
        puts("7 - Alterar o preço de um veículo específico\n");
        puts("8 - Escrever dados num ficheiro binário");
        puts("9 - Ler dados de um ficheiro binário\n");
        puts("10 - Histograma");
        puts("11 - Intervalos de preço por modelo");
        puts("12 - Escrita da base de dados ordenadamente\n");
        
        printf("Escolha uma opcao: ");
        scanf("%c", &opcao);
            
            switch(opcao)
                {
                    case '0': puts("Adeus"); break;
                    case '1': {ler_ficheiro(); break;}
                    case '2': puts("2 - Mostrar todas as marcas"); break;
                    case '3': puts("3 - Mostrar o preço de uma viatura"); break;
                    case '4': puts("4 - Escrever dados num ficheiro de texto\n"); break;
                    default : { puts("Opcao invalida! Escolha uma das opcoes disponiveis no Menu:\n"); mostrar_menu();}
                }
    }
    

/* -------------------------------------------------*/



int ler_ficheiro()
{
  char s[30];
  FILE *fp;

    puts("Introduza o nome do ficheiro: ");
    gets(s);
    gets(s);

    fp= fopen(s, "r");
        
        if (fp==NULL)
            printf("não foi possivel ler o ficheiro %s \n", s);
        else
            {
            ler_fich_texto();
            }
            
}

/* -------------------------------------------------*/

int  ler_fich_texto(const char *fp)
{
  int parametros;
  int result;
  FILE *stream;
  char s;
  
  
  parametros = 0;
  fopen(fp, "r");
  if ( stream )
  {
    parametros = 0;
    while ( fgets(&s, 150, stream) )
    {
      ++parametros;
    }
    fclose(stream);
    printf("Foram lidos %d registos\n", parametros);
  }
  else
  {
    printf("Erro ao abrir o ficheiro %s para ler\n", fp);
    result = 0;
  }
  mostrar_menu ();
}


/* -------------------------------------------------*/

main ()
{
    int i=1;
    while(i==1)
    {
    mostrar_menu();
    i++;
    }
}

Basicamente estou a compilar usando CYGWIN - e o que acontece é que dá Segmentation Fault - (core dumped).

O que eu quero que isso faca e que leia um ficheiro de .txt (base de dados) e diga quantos parametros essa base de dados tem.

Apenas a opcao 0 e 1 funcionam - as outras ainda não tão acabadas!

O ficheiro .txt que estou falando é ESTE AQUI

Minha programacao e terrivel, qualquer ajuda seria tremenda!

Edited by Caladan
Link to comment
Share on other sites

2 answers to this question

Recommended Posts

  • 0

int ler_ficheiro()
{
  char s[30];
  FILE *fp;

    puts("Introduza o nome do ficheiro: ");
    gets(s);
    gets(s);

    fp= fopen(s, "r");
        
        if (fp==NULL)
            printf("não foi possivel ler o ficheiro %s \n", s);
        else
            {
            ler_fich_texto();
            }
            
}
Porque voce coloca 2 gets(s)? se for o caso de limpar o buffer utilize o fflush(stdin)(para windows) ou o __fpurge(stdin)(para linux)
int  ler_fich_texto(const char *fp)
{
  int parametros;
  int result;
  FILE *stream;
  char s;
  
  
  parametros = 0;
  fopen(fp, "r");
  if ( stream )
  {
    parametros = 0;
    while ( fgets(&s, 150, stream) )
    {
      ++parametros;
    }
    fclose(stream);
    printf("Foram lidos %d registos\n", parametros);
  }
  else
  {
    printf("Erro ao abrir o ficheiro %s para ler\n", fp);
    result = 0;
  }
  mostrar_menu ();
}

acredito que o segmet fault deve estar acontecendo no stream... pois você utlizou o fopen mas não faz o segunte stream = fopen(fp, "r"); então o stream é um ponteiro nulo

Edited by Ruyfreis
Link to comment
Share on other sites

  • 0

Vou fazer um favorzao pra ti... executei o codigo na minha maquina e corrigi todos os possiveis erros e comentei... espero ter ajudado//

#include <stdio.h>
#include <stdlib.h>



    mostrar_menu ()
    {
        char opcao;

        puts("\n\tViaturas? É comigo!\n");
        puts("0 - Sair do programa");
        puts("1 - Ler o ficheiro de texto");
        puts("2 - Mostrar todas as marcas");
        puts("3 - Mostrar o preço de uma viatura");
        puts("4 - Escrever dados num ficheiro de texto\n");
        puts("5 - Mostrar modelos de uma marca");
        puts("6 - Mostrar preço de uma viatura específica");
        puts("7 - Alterar o preço de um veículo específico\n");
        puts("8 - Escrever dados num ficheiro binário");
        puts("9 - Ler dados de um ficheiro binário\n");
        puts("10 - Histograma");
        puts("11 - Intervalos de preço por modelo");
        puts("12 - Escrita da base de dados ordenadamente\n");

        printf("Escolha uma opcao: ");
        scanf("%c", &opcao);

            switch(opcao)
                {
                    case '0': puts("Adeus"); break;
                    case '1': {ler_ficheiro(); break;}
                    case '2': puts("2 - Mostrar todas as marcas"); break;
                    case '3': puts("3 - Mostrar o preço de uma viatura"); break;
                    case '4': puts("4 - Escrever dados num ficheiro de texto\n"); break;
                    default : { puts("Opcao invalida! Escolha uma das opcoes disponiveis no Menu:\n"); mostrar_menu();}
                }
    }


/* -------------------------------------------------*/



int ler_ficheiro()
{
  char s[30];
  FILE *fp;

    puts("Introduza o nome do ficheiro: ")
    //Utilizei esta funcao para voce ao ter de ficar colocando "gambiarra" de 2 gets() que nem sempre funciona//
    scanf("%s", s);
    //Funcao de limpa o buffer de entrada do teclado
    fflush(stdin);

    fp= fopen(s, "r");

        if (fp==NULL)
            printf("não foi possivel ler o ficheiro %s \n", s);
        else
        {
                //Voce havia esquecido de enviar o parametro para a funcao com o caminho do arquivo de entrada//
                ler_fich_texto(s);
         }

}

/* -------------------------------------------------*/

int  ler_fich_texto(const char *fp)
{
  int parametros;
  int result;
  FILE *stream;
  //Voce declarou como um caracter e não um vetor de caracteres//
  char s[150];


  parametros = 0;
  //Havia esquecido de atribuir o fopen a variavel stream//
  stream = fopen(fp, "r");
  //É melhor garantir que o ponteiro não esteja NULL//
  if ( !stream==NULL )
  {
    parametros = 0;
    while ( fgets(&s, 150, stream) )
    {
      ++parametros;
    }
    fclose(stream);
    printf("Foram lidos %d registos\n", parametros);
  }
  else
  {
    printf("Erro ao abrir o ficheiro %s para ler\n", fp);
    result = 0;
  }
  mostrar_menu ();
}


/* -------------------------------------------------*/

main ()
{
    int i=1;
    while(i==1)
    {
    mostrar_menu();
    i++;
    }
}

Agora ta funcioando certinho ^^

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...