Newsgroup: it.comp.lang.c
Titolo: tail..perchè non funziona?

ciao a tutti, c'è qualche anima buona che saprebbe dirmi cosa non va in
questo prog? so che non è bene postare tutto il sorgente ma non so proprio
dove sia l'errore: è una specie di tail che usa una linked list tipo fifo
funziona tutto bene ma alla fine dopo l'output desiderato compare
segmentation fault :(
ecco il source:
<code>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* legge una riga dal file */
int fgetline(FILE *file, char *line) 
{
  int i, c;
  i=0;
  while(( c = getc(file)) != EOF) {
    line[i] = c;
    i++;
    if( c == '\n') break;
  }
  if(c == EOF && i == 0) return EOF;
  line[i] = '\0';
  return i;
}
int main(int argc, char *argv[])
{
  struct plist{
    char text[200];
    struct plist *next;
  };
  FILE *input;
  char riga[100];
  struct plist *firstitem;
  struct plist *item;
  struct plist *tmp;
  int k = 0;
  int maxln = 5;
  firstitem = malloc(sizeof( struct plist));
  item = firstitem;
  if(argc != 2)
    printf("Usage: %s filename\n"
	   "filename is file you want to tail\n", argv[0]);
  input = fopen(argv[argc-1], "r");
  while(fgetline(input, riga) != EOF) {
    if(k >= maxln) {
      tmp = firstitem;
      firstitem = firstitem->next;
      free(tmp);
    }
    item->next = malloc(sizeof(struct plist));
    strcpy(item->text, riga);
    item = item->next;
    k++; 
  }
  free(item);
  item = firstitem;
/* credo che l'errore sia qui, non trova NULL e tenta di leggere item
 * inesistenti, ma non ne sono sicuro.. però se al posto di while metto
 * for(i=0; i < maxln; i++) funziona perchè lo costringe a fermarsi
 * comunque ma non è quello che voglio, deve fermarsi quando no ci sono
 * più elementi!
 */
  while(item != NULL) {
    printf("%s", item->text);
    item = item->next;
  }
  return 0;
}
</code>
grazie a chi vorrà aiutarmi, o anche darmi qualche consiglio sul metodo di
implementazione del tail!
ciao
-- 
[Filippo...........................]
[Linux User #342745................]
[remove ANTISPAM for reply.........]
        ==[...penguin powered...]==

 
-- 
Mat/tia Belletti - Undergraduate student @ 
cs.unibo.it
ICQ: 33292311    - email: 
mbel...@cs.unibo.it
IRC: RedGlow     - site(s): 
http://www.cs.unibo.it/~mbellett
Linux registered user 299762 @ Linux registered machine 213003

 che e' anche piu' logico ed elegante.
allora ho risolto come dicevi tu mettendo il testo direttamente sul nuovo
elemento.. però così mi serve comunque un firstitem vuoto all'inizio da
cui partire con gli item->next.. ho risolto mettendo questo dopo il ciclo
while..
firstitem = firstitem->next;
che sposta l'inizio della lista di una posizione tenendo conto che la
prima è vuota (spero di essermi un pò fatto capire..) comunque mi rimane
una plist (che era il primo firstitem in assoluto) allocata senza niente
dentro.. dovrei salvarmi l'indirizzo in un puntatore e liberarla dopo?
però il seg fault arriva lo stesso.. ho risolto mettendo 
item->next = NULL; dopo il ciclo while.. anche questo sembra funzionare ma
mi sembra poco ortodosso..
grazie dei consigli! farò il possibile per metterli in pratica!


 grazie dei consigli! farò il possibile per metterli in pratica!
Purtroppo la trattazione di liste linkate presenta quasi sempre dei 
"punti singolari" all'inizio e/o fine, perche' quelli rimangono. 
Solitamente, si usano per l'appunto nodi vuoti che stanno a fare da 
sentinella.
