Ir para o conteúdo
lulasaraiva

Função para ler linha

Mensagens Recomendadas

lulasaraiva    0
lulasaraiva

Bom dia pessoal,

Será que me ajudar nesta função que eu estou a implementar para um trabalho. É que estou a ter algum problema nesta função mas não estou a perceber qual, não me dá nenhum erro e tambem não dá segmentation fault.

char* le_linha(FILE* f)
{
   char c,*linha=malloc(sizeof(char));
   int i=0;
   while((c=getc(f)) !='\n')
   {
       linha=realloc(linha,(i+1)*sizeof(char));
       linha[i]=c;
       i++;
   }
   return linha;
}

a função tem de retornar a linha.

Obrigado por tudo

Editado por thoga31
Tags code + GeSHi

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
lulasaraiva    0
lulasaraiva

ja consegui resolver o problema mas agora tenho outro estou a passsar o ficheiro todo e nao linha a linha (o codigo esta embaixo)

char* le_linha(FILE* f)
{
char c, *linha=malloc(sizeof(char));
int i=0;
if (f==NULL)
	print_error("NULL FILE em le_linha");
while(fscanf (f, "%c", &c) !=EOF)
{
	if(c=='\n')
		break;
	linha=realloc(linha,(i+1)*sizeof(char));
	linha[i]=c;
	i++;
}
return linha;
}

Editado por apocsantos
geshi

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

nesse código, onde está a instrução que indica que deve parar ao determinar que chegou ao final da linha ?


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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

vamos lá ver uma coisa ...

interessa mesmo estares a fazer esses reallocs todos ?

se tiveres a certeza que uma linha nunca vai ultrapassar um valor X toda essa função é desnecessária


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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

e necessario porque e para fazer para qualquer ficheiro

não, não é ...

char* le_linha(FILE* fd) {
   long start, end;
   char c, *line = NULL;

   if (!fd || (start = end = ftell(fd)) == -1)
       return NULL;

   do {
       end++;
   } while ((c = fscanf(fd, "%c", &c)) != EOF && c != '\n');
   fseek(fd, start, SEEK_SET);

   if ((line = calloc((end - start + 1) + 1, 1)) == NULL)
       return NULL;

   if (fscanf(fd, "%[^\n]\n", line) != 1)
       return NULL;

   return line;
}


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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
lulasaraiva    0
lulasaraiva

So mais uma coisa

Eu tenho a seguinte estrutura de uma trie

typedef struct trie_ {

int se_palavra; /* 1 - se presenta uma palavra encontrada

no documento */

lista* docs; /* lista de documento que contém essa palavra */

/*

* apontadores para os filhos (um por letra do alfabeto).

* Se nao houver um prefixo valido, o valor do apontador

* deverá ser NULL.

*/

struct trie_* filhos[NUM_CHARS];

} trie;

e tenho de fazer uma funcao para inicializar uma trie nova

trie* nova_trie()

{

int i=0;

trie *t=(trie *) malloc(sizeof(trie));

t->docs=lista_nova();

for(i=0;i<26;i++)

{

t->filhos=NULL;

}

t->se_palavra=0;

return t;

}

está certa?

Editado por lulasaraiva

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

e que erro dá ?

(já reparaste que ao continuares a omitir informação útil que o computador te dá, a resposta do fórum é atrasada ?)


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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

se o programa fica "encavado", é porque entra em ciclo infinito, e o único ciclo que se encontra no código apresentado não é a razão desse problema.

Editado por HappyHippyHippo

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
lulasaraiva    0
lulasaraiva

Obrigado ja esta a funcionar

Será que me podes ajudar so mais numa funcao que eu nao tou a perceber como fazer

int* pesquisa(trie* t, char** palavras, int nr_palavras, int* nr_resultados)

{

int i, j, *d, *ranking,k;

lista *a=lista_nova(), *min=lista_nova(), *max=lista_nova();

elemento *aux, *aux2;

if(t==NULL || palavras==NULL || nr_palavras<=0 || nr_resultados==NULL )

print_error("Null argument");

for(i=0; i<nr_palavras; i++)

{

for(j=0; j<strlen(palavras); j++)///// meter o limite de j

{

t=t->filhos[palavras[j]-'a'];

}

lista_interseta(a,t->docs,max_op(t->docs->raiz->ocorrencias,a->raiz->ocorrencias));

}

for(i=0; i<nr_palavras; i++)

{

min=lista_interseta(min,a, min_op(min->raiz->ocorrencias,a->raiz->ocorrencias));

max=lista_interseta(max,a, max_op(max->raiz->ocorrencias,a->raiz->ocorrencias));

min->raiz=min->raiz->proximo;

max->raiz=max->raiz->proximo;

a->raiz=a->raiz->proximo;

}

d=(int*)malloc(lista_tamanho(min)*sizeof(int));

ranking=(int*)malloc(lista_tamanho(min)*sizeof(int));

//fazer o ranking

aux=min->raiz;

aux2=max->raiz;

for (i=0; i<lista_tamanho(min);i++)

{

d=aux->elem;

ranking=aux->ocorrencias+aux2->ocorrencias;

aux=aux->proximo;

aux2=aux2->proximo;

}

for (i=0; i<lista_tamanho(min)-1;i++)

{

if(ranking<ranking[i+1])

{

k=ranking;

ranking=ranking[i+1];

ranking[i+1]=k;

k=d;

d=d[i+1];

d[i+1]=k;

k=1;

}

if(k==1)

i=0;

}

return d;

A funcao deve fazer o seguinte:

Retorna o ranking do documentos de acordo com a pesquisa solicitada

*

* Parâmetros:

* - t: trie.

* - palavras: a sequência de palavras solicitada

* - nr_palavras: numero de palavras da pesquisa

* - nr_resultados: numero de documentos que satisfazem

* a pesquisa (passado por referência)

* Retorna: a sequência de documentos que satisfazem a pesquisa

* ordenados de acordo com o com o especificado com o enunciado.

* Cada documento é identificado pelo seu índice no array

*

* Observação: Se o apontador for NULL para qualquer parâmetro

* deverá chamar a função "print_error" (utils.c) com a string

* "Null argument" passada como argumento

Partilhar esta mensagem


Link 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.