[C] Problema con funzione fgets

irelimax
Ciao a tutti,

sto cercando di scrivere un programma in C che mi legga una matrice di caratteri presente in un file e la memorizza in una matrice di caratteri normale.

Il main è il seguente:

int main(int argc, char *argv[])
{
    FILE *ptrvip;
    int n_righe = 0, n_colonne = 0;

    if(argc!=2 && (ptrvip=fopen(argv[1], "r"))==NULL)
    {
        printf("Impossibile aprire il file %s\n", argv[1]);
        exit(EXIT_FAILURE);
    }
    else
    {
        printf("File %s letto correttamente!\n\n", argv[1]);
        //metto la & prima delle variabili per indicare che sto effetuando un passaggio di parametri per riferimento (ovvero per indirizzo)
        //e non per valore

            char** matricevip = leggi_matrice(ptrvip, &n_righe, &n_colonne);

    }

    fclose(ptrvip);

    return 0;
}





mentre la funzione che utilizzo è cosi implementata:

char** leggi_matrice(FILE *nomefile, int *r, int *c)
{
    printf("\nTest1\n");
    //**matricevip è un doppio puntatore(un puntatore per le righe e uno per le colonne)
   char buffer[MAX_C], *res, **matricevip, temp;
   int i = 0, j = 0;
      //Acquisizione numero di colonne
      res = fgets(buffer, MAX_C, nomefile);

      printf("\nTest2\n");

      while(res[i] != '\0')
      {
            *c = *c +1;
         i++;
      }

      printf("\nNumero colonne: %d\n", *c);

      //Riposiziono il cursore all'inizio del file
      fseek(nomefile, 0, 0);


      //Conto il numero della righe
      while(1)
      {
         res = fgets(buffer, MAX_R, nomefile);
         if(res == NULL)
            break;
         *r = *r + 1;
      }

      printf("\nNumero righe: %d\n", *r);



      //Allocazione dinamica della memoria
      matricevip = (char**) malloc (*c * sizeof(char*));//alloco lo spazio per le colonne
      for(i = 0; i < *c; i++)
         matricevip[i] = (char*) malloc (*r * sizeof(char));//alloco lo spazio per le righe

      //Riposiziono il cursore all'inizio del file
      fseek(nomefile, 0, 0);

      //Caricamento della matrice da file

      while(!feof(nomefile))
      {
         for(i = 0; i < *r; i++)
            for(j = 0; j < *c; j++)
            {
               fscanf(nomefile, "%c", &temp);
               if(temp != '\0')
                  matricevip[i][j] = temp;

            }

      }

      //Stampa della matrice
      for(i = 0; i < *r; i++)
      {
         for(j = 0; j < *c; j++)
            printf("%c", matricevip[i][j]);
         //printf("\n");
      }
}


dove MAX_C e MAX_R sono delle costanti definiti tramite #define.

Il programma smette di funzionare quando cerca di processare l'istruzione

res = fgets(buffer, MAX_C, nomefile);


all'interno della funzione "leggi_matrice".

Qualcuno sa dirmi cosa sbaglio?

Grazie.

Risposte
onlyReferee
"irelimax":

[...]
char** leggi_matrice(FILE *nomefile, int *r, int *c)
{
    printf("\nTest1\n");
    //**matricevip è un doppio puntatore(un puntatore per le righe e uno per le colonne)
   char buffer[MAX_C], *res, **matricevip, temp;
   int i = 0, j = 0;
      //Acquisizione numero di colonne
      res = fgets(buffer, MAX_C, nomefile);
[...]
}



Il programma si blocca quando cerca di processare l'istruzione

res = fgets(buffer, MAX_C, nomefile);


all'interno della funzione "leggi_matrice".

Qualcuno sa dirmi cosa sbaglio?

Grazie.

Ciao irelimax :!:
Secondo me il problema è dovuto a come passi nomefile alla funzione fgets. Tale funzione come terzo parametro vuole una variabile di tipo FILE, te invece gli stai passando qualcosa di tipo FILE*. Prova a scrivere dunque nomefile.
Fammi sapere se funziona.

irelimax
Scusami non ho capito cosa vuoi dire. La funzione get è definita cosi:
char *fgets(char *s, int size, FILE *nomefile);


quindi alla funzione fgets non gli devo passare come terzo parametro una variabile di tipo FILE * ?

onlyReferee
Scusa, ho letto di fretta, in effetti la definizione è come dici te. In particolare che errore ti dà il programma :?:

irelimax
Grazie cmq ma ho risolto modificando il codice.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.