Ir para conteúdo
Fórum Script Brasil
  • 0

Segmentation Fault - Ajuda?


Caladan

Pergunta

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!

Editado por Caladan
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 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

Editado por Ruyfreis
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...