PDA

Visualizza la versione completa : [C] Lettura valori numerici da file ed errore "segmentation fault"


xglobusx
21-06-2007, 00:54
Devo leggere un file con questo contenuto:

8
3 4 -1
5 -1
7 4 8 -1
-1
6 -1
7 2 -1
-1
4 7 -1

che passo a questo prgramma

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "grafi.h"

int main(int argc, char *argv[]){


FILE *fpin;
char * nomeFile;
char tmp[80];
char *tokptr;
int nV=0;

grafo *G;
int v1;
int i;


if(argc!=2){
printf("Utilizzo: %s nomefile\n", argv[0]);
return -1;
}
nomeFile=argv[1];
if((fpin=fopen(nomeFile,"r"))==NULL){

printf("ERRORE APERTURA FILE \"%s\"\n", argv[1]);

return -1;

}

printf("File APERTO\n");

/*Legge numero vertici*/
fscanf(fpin, "%d\n", &nV);

printf("Numero di vertici: %d", nV);
G = grafoInit( nV ) ;
for(i=1; i<=nV; i++){
fgets(tmp, 80, fpin);
tokptr=strtok(tmp, " ");
while(strcmp(tmp, "-1")!=0){
grafoAddEdge(G, i, atoi(tokptr));
tokptr=strtok(NULL, " ");
}
}

grafoPrint( G ) ;
return 0;
}

l'errore in
fscanf(fpin, "%d\n", &nV); help!

LeleFT
21-06-2007, 08:34
Con quell'istruzione leggi un numero intero seguito da un A_CAPO. E non mi sembra il tuo caso, visto l'esempio...


Ciao. :ciauz:

oregon
21-06-2007, 09:09
l'errore in
fscanf(fpin, "%d\n", &nV); help!

Di quale errore parli?

xglobusx
21-06-2007, 09:48
Segmentation fault (core dumped) l'errore.
Se faccio



fscanf(fpin, "%s", tmp);
dichiarando tmp come

char *tmp;

Legge la riga, ma poi come faccio a mettere il numero letto in nV che un intero?

oregon
21-06-2007, 10:04
Originariamente inviato da xglobusx
Segmentation fault (core dumped) l'errore.
Se faccio



fscanf(fpin, "%s", tmp);
dichiarando tmp come

char *tmp;

Legge la riga, ma poi come faccio a mettere il numero letto in nV che un intero?

Stai facendo un po' di confusione, perche' questa riga non c'e' nel codice che avevi proposto. Anzi, avevi detto che era quest'altra

fscanf(fpin, "%d\n", &nV);

che ti dava errore.

Per capirci, la

fscanf(fpin, "%d\n", &nV);

va bene e leggi il valore 8 nella variabile nV.

Invece, la riga

fscanf(fpin, "%s", tmp);

non va bene perche' tmp deve puntare ad una stringa "allocata" ... se utilizzi solamente un puntatore senza allocare lo spazio, ovviamente avrai un segmentation fault.
Devi scrivere

char tmp[80];
fscanf(fpin, "%s", tmp);

Pero', ti ripeto, la prima riga che avevi fornito

fscanf(fpin, "%d\n", &nV);

(e che dicevi che ti dava errore) funziona regolarmente.

xglobusx
21-06-2007, 10:15
la seconda una modifica che ho fatto per provare un'altra soluzione.
hai ragione la prima funziona, non li l'errore, ma dopo, a quanto pare qua:
printf("Numero di vertici: %d", nV);

xglobusx
21-06-2007, 10:25
ora funziona.grazie

Loading