[C] Problema con funzione fgets
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:
mentre la funzione che utilizzo è cosi implementata:
dove MAX_C e MAX_R sono delle costanti definiti tramite #define.
Il programma smette di funzionare quando cerca di processare l'istruzione
all'interno della funzione "leggi_matrice".
Qualcuno sa dirmi cosa sbaglio?
Grazie.
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
"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.
Scusami non ho capito cosa vuoi dire. La funzione get è definita cosi:
quindi alla funzione fgets non gli devo passare come terzo parametro una variabile di tipo FILE * ?
char *fgets(char *s, int size, FILE *nomefile);
quindi alla funzione fgets non gli devo passare come terzo parametro una variabile di tipo FILE * ?
Scusa, ho letto di fretta, in effetti la definizione è come dici te. In particolare che errore ti dà il programma

Grazie cmq ma ho risolto modificando il codice.