Punto informatico Network
Login Esegui login | Non sei registrato? Iscriviti ora (è gratuito!)
Username: Password:
  • Annuncio Pubblicitario

[C] fgets & puntatore alla riga letta

Il forum per tutti i developer. Leggere attentamente il regolamento di sezione prima di postare.

[C] fgets & puntatore alla riga letta

Messaggioda Zane » gio mag 05, 2005 10:38 am

Ciao, ho un problemino con questa funzione

Codice: Seleziona tutto
void esercizio03 (char * percorso, int * ritorno){
   int filedes,dummyvar,contatore;
   char * read_stream;
   char * indirizzo_riga;
   char riga_letta[300];
   
   contatore=0;
   
   printf("\n *** %s ***\n", percorso);
   //apro il file, se qualcosa nn va ritorno -1
   filedes=open(percorso,O_RDONLY);
   
   if (filedes==-1)
      ritorno[0]=-1;
   else{
      //numero di caratteri
      ritorno[0]=lseek(filedes,0,SEEK_END);
      
      //numero di parole
      ritorno[1]=0;
      
      //numero di righe
      read_stream=(char *) malloc(ritorno[0]);
      dummyvar=lseek(filedes,0,SEEK_SET);
      dummyvar=read(filedes, read_stream, ritorno[0]);

      while (1){
                  indirizzo_riga=fgets(riga_letta,250,read_stream);
         if (indirizzo_riga==NULL)
            break;
         else
            contatore ++;   
      }
      ritorno[2]=contatore;
   }
      
}


Il problema è che indirizzo_riga=fgets(riga_letta,250,read_stream) secondo il gapil, dovrebbe ritornarmi l'indirizzo di riga_letta se ok, oppure NULL in caso di problemi: in realtà mi sputa un segmentation fault e mi manda bellamente a quel paese [:-D]

Il sorgente completo è qui

Suggerimenti?
Avatar utente
Zane
MLI Hero
MLI Hero
 
Messaggi: 7935
Iscritto il: lun ago 05, 2002 9:36 am
Località: Ferrara

Messaggioda thomas » gio mag 05, 2005 10:45 am

Io aspetto che risolvi da solo rileggendola... com'è capitato le ultime 2 volte! hihihi
"Am too late to get too high to get, too late to wash my face and hands "
Mr Hudson and the Library - Too Late Too Late
Avatar utente
thomas
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 6858
Iscritto il: mer lug 09, 2003 6:30 pm
Località: Parma

Messaggioda Leo » gio mag 05, 2005 11:37 am

Secondo me il problema sta nella riga:

fgets(riga_letta,250,read_stream);

la funzione fgets ha prototipo:

char * fgets (char * string , int num , FILE * stream);

per cui l'ultimo parametro deve essere un puntatore a file, e non un puntatore a char come nel tuo caso... Da quello che mi ricordo fgets prende un intera riga di un file.
Leo
Responsabile Tecnico MegaLab.it
Avatar utente
Leo
Silver Member
Silver Member
 
Messaggi: 1683
Iscritto il: lun ago 05, 2002 9:36 am
Località: Ferrara


Messaggioda Zane » gio mag 05, 2005 11:56 am

Ho provato a chiamarla con
Codice: Seleziona tutto
fgets(riga_letta,250,percorso)

Passando cioè il percorso del file su cui voglio lavorare.

Ho provato anche con
Codice: Seleziona tutto
fgets(riga_letta,250,filedescriptor)

scelta che, a mio modestissimo avviso, dovebbe essere la + logica, ma anche così niente da fare.

Il problema principale secondo me è il tipo di variabile che deve prendere l'output della funzione: continuo a ricevere
assignment makes pointer from integer without a cast

in tutti e tre i modi..
Avatar utente
Zane
MLI Hero
MLI Hero
 
Messaggi: 7935
Iscritto il: lun ago 05, 2002 9:36 am
Località: Ferrara

Messaggioda Robby78 » gio mag 05, 2005 12:33 pm

Premetto che non conosco il C. Dalla descrizione dell'errore mi pare che non riesca a fare un cast implicito; quindi cercando di non dire una c****a clamorosa, mi espongo: non è che dà problemi il valore assoluto 250 che non è interpretato x qualche motivo come int e necessita di un cast esplicito? Hai provato a mettere il 250 dentro ad una variabile int ed a passare quella alla funzione?

Aspetta... ma non è che tu debba passargli soltanto un elemento dell'array riga_letta? es. riga_letta[1]
Povera patria! Schiacciata dagli abusi del potere di gente infame, che non sa cos'è il pudore - Franco Battiato
ricordati di pensare! - mia mamma
Avatar utente
Robby78
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 3829
Iscritto il: gio gen 08, 2004 5:25 pm
Località: Emilia Romagna

Messaggioda Zane » gio mag 05, 2005 12:37 pm

Il problema principale secondo me è nell'assegnazione del dato ritornato da fgets alla variabile...comunque per scrupolo ho provato anche il tuo suggerimento [:-D]

p.s. Vedete xchè preferisco VB? [sedia] [sedia]
Avatar utente
Zane
MLI Hero
MLI Hero
 
Messaggi: 7935
Iscritto il: lun ago 05, 2002 9:36 am
Località: Ferrara

Messaggioda Leo » gio mag 05, 2005 1:05 pm

Questo è un esempio di uso di fgets funzionante. L'ho provato prima con il borland c compiler:

Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>

void main()
   {
      FILE *fp;
      char *buf, *ind_primo_car_letto;
      fp = fopen("prova.txt","r");

      buf = (char*) malloc(200*sizeof(char));
      
      ind_primo_car_letto = fgets(buf,200,fp);

      if (ind_primo_car_letto == NULL)
         printf("Il file è vuoto");
      else
         printf("%s",buf);
   }


L'ultimo parametro di fgets deve essere un puntatore a file, quindi dichiarato come FILE *puntatore;
Il ritorno della funzione è l'indirizzo del primo carattere della stringa letta e serve solo per capire se è stato effettivamente letto qualcosa oppure no. Nel caso fgets non abbia letto niente dal file ritorna NULL.

Detto questo, direi che l'istruzione per la fgets nel tuo caso deve diventare:

indirizzo_riga = fgets(riga_letta,250,filedes);
Leo
Responsabile Tecnico MegaLab.it
Avatar utente
Leo
Silver Member
Silver Member
 
Messaggi: 1683
Iscritto il: lun ago 05, 2002 9:36 am
Località: Ferrara

Messaggioda Zane » gio mag 05, 2005 1:55 pm

Ok, grazie all'aiuto di Leo ho scoperto l'arcano.

Il problema è che fgets prendde come ultimo parametro un puntatore a file, che non è la stessa cosa che passare un filedescriptor oppure il percorso del file medesimo.

Io stavo utilizzando il set di funzionalità POSIX, in cui l'apertura del file (OPEN) restituisce un semplice filedescriptor, ovvero l'identificativo del file sottoforma di INT, che poi viene utilizzato dalle funzioni per aprire il file (funziona un po' come un HANDLE in visualbasic..)

Come dicevo, fgets vuole invece un puntatore a file: ho quindi riapero il file con fopen, funzione standard C, che restituisce appunto un puntatore al file.

Il mio programma corretto è diveno quindi

Codice: Seleziona tutto
void esercizio03 (char * percorso, int * ritorno){
   int filedes,dummyvar,contatore;
   char * read_stream;
   char * indirizzo_riga;
   char riga_letta[300];
   
   contatore=0;
   
   printf("\n *** %s ***\n", percorso);
   //apro il file, se qualcosa nn va ritorno -1
   filedes=open(percorso,O_RDONLY);
   
   if (filedes==-1)
      ritorno[0]=-1;
   else{
      //printf ("Filedes: %d\n\n", lseek(filedes,0,SEEK_END));
      //numero di caratteri
      ritorno[0]=lseek(filedes,0,SEEK_END);
      
      //numero di parole
      ritorno[1]=0;
      
      //numero di righe
      FILE * filepointer;
      filepointer=fopen(percorso,"r");
      
      read_stream=(char *) malloc(ritorno[0] * sizeof(char));
      dummyvar=lseek(filedes,0,SEEK_SET);
      dummyvar=read(filedes, read_stream, ritorno[0]);

      printf("** Buffer di lettura: %s **\n", read_stream);
      while (1){
         indirizzo_riga=fgets(riga_letta,250,filepointer);

         if (indirizzo_riga==NULL)
            break;
         else
            contatore ++;   
      }
      ritorno[2]=contatore;
   }
      
}


Grazie ancora a tutti x l'aiuto (e come sempre mitico Leo...)
Avatar utente
Zane
MLI Hero
MLI Hero
 
Messaggi: 7935
Iscritto il: lun ago 05, 2002 9:36 am
Località: Ferrara


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti

Powered by phpBB © 2002, 2005, 2007, 2008 phpBB Group
Traduzione Italiana phpBB.it

megalab.it: testata telematica quotidiana registrata al Tribunale di Cosenza n. 22/09 del 13.08.2009, editore Master New Media S.r.l.; © Copyright 2008 Master New Media S.r.l. a socio unico - P.I. 02947530784. GRUPPO EDIZIONI MASTER Spa Tutti i diritti sono riservati. Per la pubblicità: Master Advertising