Newsgroup: it.comp.lang.c
Titolo: apertura e lettura file

Scusate la domanda stupidissima, ma non riesco a capire il problema in
questa funzione.
Essa deve prendere le parole che stanno nel file fp, minuscolizzarle 
e trasferirle in *word.
Ma , quando vado a compilare il tutto, mi dice che c'è un errore nella
fopen. Il problema è che non gli devo passare il nome del file, ma il nome
del file cambia ogni volta.
cos'è che sbaglio?????
questo è il codice:
int getWord(FILE *fp, char *word){
char currentchar[MAX];
int i=0;
fp=fopen(fp,"r");
while(*fp!=EOF){
 fscanf(fp,"%s",*currentchar);
        while(currentchar[i]!='\n'){
                currentchar[i]=tolower(currentchar[i]);
                i++;
                }
                }
               }
Grazie!!
Andrea

 int getWord(FILE *fp, char *word){
               ^^^^^^^^
Deciditi:
1) o fp e` il const char * che contiene il nome del file che serve a fopen()
2) o fp e` un FILE * che e` il valore di ritorno di fp.
-- 
   |   \    \  | ___|_  |_  | ianezz a casa sua... :-)
   |  _ \  | \ | _|    /   /  Visita il LinuxTrent a
  _|_/  _\_|  _|____|___|___| 
http://www.linuxtrent.it

 
Fp è il file che contiene la parola da leggere.
Non posso indicare con lo stesso puntatore anche quello che contiene fp?
Se no, come dovrei fare???
Ti ringrazio
ciao
andrea

 Non posso indicare con lo stesso puntatore anche quello che contiene fp?
No, perche` fopen() vuole un const char * per il nome, non un FILE *...
Chiaro, entrambi son puntatori, ma a due tipi diversi.
 > while(*fp!=EOF)
casomai
   while (! feof(fp))
 > fscanf(fp,"%s",*currentchar)
casomai
   fscanf(fp,"%s",currentchar);
e nota che fscanf() invocata cosi` legge un'intera parola alla volta, 
non un carattere solo. Usa fgetc() per leggere un carattere, o fgets() 
per leggere un'intera riga.
Alla fine della giornata (o meglio, all'inizio di quella nuova), eccoti 
una funzione a cui passi nell'ordine:
1) Il nome del file da aprire
2) Un'area di memoria che hai allocato con malloc() o un vettore di char 
  di una certa dimensione
3) La dimensione in byte dell'area di cui sopra.
Esce con 0 se tutto e` OK, e con un valore diverso da zero se ci sono 
errori.
Se non ci sono errori, in buffer ti ritrovi la prima parola del file 
convertita in minuscolo.
----------------------------------------------------------------------
int
readword(const char * filename, char * buffer, int buffersize)
{
     FILE * fp;
     char * c;
     /* Terminiamo il buffer per sicurezza, casomai
      * l'apertura fallisse.
      */
     *buffer = '\0';
     /* Apre il file "filename" in lettura */
     fp = fopen(filename,"r");
     /* Se l'apertura e` fallita... */
     if(fp == NULL)
     {
         /* ...ritorna subito con un errore. */
         return 1;
     }
     /* Legge una riga intera
     if ( fgets(buffer,buffersize,fp) == NULL)
     {
        /* ...e se qualcosa va storto, chiude il file e
         * ritorna subito con un errore.
         */
        fclose(fp);
        return 1;
     }
     /* Ora in buffer c'e` la riga intera.
      * Convertiamola in minuscolo
      */
     for(c = buffer; *c != '\0' && ! isspace(*c); c++)
     {
         *c = tolower(*c);
     }
     /* O "pesta" sopra il primo spazio, o pesta sopra
      * il '\0' gia` esistente. In ogni caso,
      * buffer ora viene terminato alla prima parola.
      */
     *c = `\0`;
     /* Tutto ok. Ora buffer contiene la parola in minuscolo */
     fclose(fp);
     return 0;
}
Nota che il ciclo for per convertire in minuscolo e` equivalente a
     int i=0;
     for(i=0; buffer[i] != '\0' && ! isspace(buffer[i]); i++)
     {
         buffer[i] = tolower(buffer[i]);
     }
     buffer[i] = '\0';
solo che lo faccio direttamente con i puntatori. fgets() garantisce che 
in ogni caso buffer termini con uno zero binario ('\0'), per cui non 
serve confrontare i con buffersize, basta solo andare avanti finche` non 
si trova uno zero binario o un newline.


 
Ti ringrazio per i consigli.
I parametri che devo passare purtroppo sono quelli che avevo messo nella
getWord, cmq vedendo la tua funzione ho capito come mi devo muovere per
farla funzionare anche nella mia (almeno spero! :) ).
Grazie ancora
Andrea