Jump to content

Função para ler linha


lulasaraiva
 Share

Recommended Posts

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

Edited by thoga31
Tags code + GeSHi
Link to comment
Share on other sites

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;
}
Edited by apocsantos
geshi
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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?

Edited by lulasaraiva
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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
 Share

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