Jump to content

Recommended Posts

Posted (edited)

Boa noite, durante o estudo surgiu-me aqui um problema, a variável b fica a null, ou seja quando se vai fazer o strtok dá falha de segmentação,alguém me pode dizer o que pode ser?

PRODUTO * ler_ficheiro(char *caminho) {

FILE * produto;
PRODUTO *L= NULL;
PRODUTO * nv;
produto = fopen("produto.txt","r");
char *a,*b,*c;
char linha[25],linhab[25],linhac[25];
//char carac[15];
int id,stock;
double preco;

   if (produto==NULL) //ficheiro vazio
           return(0);

   while (fgets(linha, 25, produto)!=NULL)
   { //se o ficheiro nao estiver vazio

   nv = makenode();

         a=strtok(linha,";");
         id=atoi(a);
         b=strtok(linhab,",");printf("b:%s\n",b);
         stock=atoi(b);//AQUI DA A FALHA DE SEGMENTAÇÂO
         c=strtok(linhac,"\n");
         preco=atof(c);
         nv->id=id;
   nv->stock=stock;
   nv->preco=preco;

printf("AHAHAHA:%d\n",stock);
   L=iserirarvore(L,nv);

   //printf("Balanciei a arvore\n");
   //getchar();
   //printf("_%s _%s\n",linha,linhab);
       //printf("BI:%s\n Caracteristicas:%s\n",a,b);   
   }//while
fclose(produto);
L=balanceararvore(L);
return(L);
}
Edited by pmg
GeSHi
Posted
b=strtok(linhab,",");

o array linhab não foi inicializado, logo a função strtok, por acaso, não encontrou nenhum caracter 'n', o valor de NULL é retornado e atribuído à variável b

http://linux.die.net/man/3/strtok

The strtok() and strtok_r() functions return a pointer to the next token, or NULL if there are no more tokens.

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

Assim a primeira notei alguns erros e os identifiquei.

PRODUTO* ler_ficheiro(char* caminho)
{
   FILE* produto; // inicializa as tua variaveis
   PRODUTO* L = NULL;
   PRODUTO* nv = NULL; // seria uma boa pratica inicializares as teus ponteiros
   produto = fopen("produto.txt","r");
   char* a, *b, *c;
   char linha[25],linhab[25],linhac[25];
   // char carac[15];
   int id, stock; // inicializa as tuas variaveis!
   double preco;  // faz o mesmo aqui
   if (produto == NULL) //ficheiro vazio OU NAO EXISTE, NAO TENS PERMISSAO PARA O LER.
    return 0; // nao precisas de utilizar os parenteses aqui
   while (fgets(linha, 25, produto)!=NULL)
   { //se o ficheiro nao estiver vazio

    nv = makenode();
    a = strtok(linha,";"); // atencao que o strtok() retorna NULL caso nao encontrar uma
						   // token ao tentar partir a string pelo(s) delimitador(es)
    // como o strtok() pode retornar NULL deves sempre fazer a verificacao se a string
    // devolvida nao e NULL de forma a utilzares, ou fazer outra coisa caso for NULL.
    if (a) id = atoi(a);
    // b = strtok(linhab,","); // nao inicializaste a "linhab"
    // podes fazer isto
    b = strtok(NULL ,","); // nao inicializaste a "linhab"

    if (b)
    {
	    printf("b:%s\n",b);
	    stock = atoi(b); // possivelmente estas a utilizar uma variavel que esteja a NULL
    }

    // c = strtok(linhac,"\n"); // "linhac" nao esta inicializada
    c = strtok(NULL,"\n"); // "linhac" nao esta inicializada

    if (c) preco = atof(c); // penso que era isto que querias fazer.
    // estas a utilizar estas 3 variaveis sem as ter a inicializadas antes.
    // o que faz este teu while e os strtok(), e todo o resto que do codigo acima
    // sem sentido.
    nv->id = id;
    nv->stock = stock;
    nv->preco = preco;
    printf("AHAHAHA:%d\n", stock); // estas a utilizar uma variavel nao que nao utilizaste

    // O "L" nao foi inicializado ainda
    // se esta tua arvore for a responsavel por libertar memoria dos seus nos, poderas ter problemas
    // utilizando o L desta forma, nao posso dizer mais pois nao conheco a implementacao interna da
    // tua arvore.
    L = iserirarvore(L,nv);

    //printf("Balanciei a arvore\n");
    //getchar();
    //printf("_%s _%s\n",linha,linhab);
    //printf("BI:%s\n Caracteristicas:%s\n",a,b); 
   } //while
   fclose(produto);
   L = balanceararvore(L);
   return L;
}

Podias disponibilizar a implentacao da tua arvore?

  • Vote 1

Victarion seized the dusky woman by the wrist and pulled her to him.

Victarion - She will do it. Go pray to your red god. Light your fire, and tell me what you see.

Moqorro's dark eyes seemed to shine.

Moqorro - I see dragons.

Posted

O problema está resolvido era mesmo a questão das variáveis linhab e linhac no lugar delas substitui por null no strtok e já ficou a árvore como deve ser, posso disponibilizar a função de inserir na árvore se assim quiserem.

Obrigado pela ajuda

Posted

Nao o preciso para nada de especifico, estava apenas curioso sobre a implementacao da arvore. Se pudesses disponibilizar agradecia.

Victarion seized the dusky woman by the wrist and pulled her to him.

Victarion - She will do it. Go pray to your red god. Light your fire, and tell me what you see.

Moqorro's dark eyes seemed to shine.

Moqorro - I see dragons.

Posted (edited)

Ora aqui está ela 🙂

PRODUTO * iserirarvore(PRODUTO * arvore, PRODUTO * nodo){


 if (arvore == NULL) {
   return(nodo);
 }

if(nodo->id <= arvore->id)
 {
  if(arvore->esq != NULL)
    iserirarvore(arvore->esq, nodo);
  else
    arvore->esq = nodo;
 }
else
 {
  if(arvore->dir != NULL)
    iserirarvore(arvore->dir, nodo);
  else
    arvore->dir = nodo;
 }


  /* if (nodo->bi < arvore->bi)
   arvore->esq = iserirarvore(arvore->esq, nodo);
   else
   arvore->dir = iserirarvore(arvore->dir, nodo);*/
   return(arvore);

}
Edited by pmg
GeSHi

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
×
×
  • Create New...

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.