Programma c - problema segmentation fault

di il
17 risposte

Programma c - problema segmentation fault

Salve ragazzi mi sono appena iscritto. Ho scritto un semplicissimo programma in c in cui scrivo e leggo su un file binario. Mi continua a dare in maniera persistente errore core dump segmentation fault...ho avuto modo di notare che tale errore si presenta solo se apro il flusso su file, mentre in caso contrario va tutto liscio come l'olio. Vi prego di aiutarmi a capire dove sbaglio dato che dopo infiniti tentativi non so proprio cosa pensare .

Vi posto il codice:

#include <stdio.h>

typedef struct
{
	char nome[15];
	char cognome[15];
	int matricola;
	int esami;
}studente;

int main (int argc, char *argv[])
{
	FILE *pf;
	//pf=fopen(*argv,"rb");
	//if (pf==NULL)     //da modificare questo controllo
	//{
		int n,i;
		printf("quanti studenti vuoi inserire? "); scanf("%d",&n);
		studente stud[(n-1)];
		//pf=fopen(*argv,"ba");
		//devo leggere i vari campi ora
		char str[15],str1[15],str2[15];
		for (i=0;i<n;i++)
		{	
			printf("STUDENTE NUMERO %d: ",i);
			printf("\nil nome dello studente è: ");
			scanf("%s",stud[i].nome);   //leggere un vettore di char non richiede l'operatore & e richiede %s al posto di %c
			printf("il cognome dello studente è: ");
			scanf("%s",stud[i].cognome);		
			printf("la matricola dello studente è: ");
			scanf("%d",&stud[i].matricola);
			printf("esami sostenuti: ");	
			scanf("%d",&stud[i].esami);	
			sprintf(str,"%d",i);
			sprintf(str1,"%d",stud[i].matricola);
  			sprintf(str2,"%d",stud[i].esami);
			pf=fopen(*argv,"a+b");
			fputs(stud[i].nome,pf);
			fputs(stud[i].cognome,pf);
			fputs(str,pf);
			fputs(str1,pf);
			fputs(str2,pf);
			//fprintf(pf,"STUDENTE NUMERO %c:\n",i);
			//fprintf(pf,"nome: %s\ncognome: %s\nmatricola: %s\nesami sostenuti: %s\n",stud[i].nome,stud[i].cognome,str1,str2);
			fclose(pf);	
		};	

17 Risposte

  • Re: Programma c - problema segmentation fault

    studente stud[(n-1)];
    perchè allochi un elemento in meno del necessario?
  • Re: Programma c - problema segmentation fault

    Mmmm....si quella era stata una piccola modifica che ho dimenticato di reimpostare, originariamente ne avevo allocati n...
  • Re: Programma c - problema segmentation fault

    Comunque non so se puo essere significativo (credo proprio di no) ma lo dico lo stesso, sto lavoranto su una partizione fisica su cui ho installato ubuntu e sto scrivendo attraverso la shell
  • Re: Programma c - problema segmentation fault

    Alcune cose da rivedere:
    - non è consigliato usare fputs() per scrivere su un file binario perchè ti aggiunge il newline;
    - se hai messo i dati in una struttura usa fwrite() e scrivi l'intera struttura tutta insieme;
    - richiami una funzione come fputs() con il puntatore pf che non hai neanche aperto (è facile che porti ad un piantamento);
    - argv è utilizzato in maniera un pò allegra: prova a vederti degli esempi d'uso di argc e argv.
    Un consiglio: semplifica la struttura magari mettendoci solo 1 intero, poi quando tutto funziona vai ad aggiungere (e gestire) gli altri campi.
  • Re: Programma c - problema segmentation fault

    Ringrazio immensamente per i consigli, ho capito il modo errato in cui utilizzavo argv, le differenze tra le varie funzioni di scrittura le conosco ho utilizzato fputs solo per variare e vedere se (almeno con fputs) andava, apprezzo comunque il consiglio.
    L'unica cosa che non capisco è in che senso non ho aperto il puntatore pf? non l'ho inizializzato attraverso fopen
  • Re: Programma c - problema segmentation fault

    Dato che argv [0] dovrebbe contenere il percorso del file eseguibile, credo che così apri l'eseguibile per la sovrascrittura...

    Ma hai cambiato il codice?
  • Re: Programma c - problema segmentation fault

    non l'ho inizializzato attraverso fopen?
    Hai commentato la chiamata a fopen() quindi pf contiene un valore indefinito; se vuoi fare delle prove almeno falle che possano funzionare (se richiami fputs() con pf indefinito potrebbe portarti ad un crash).
    Però: siccome con i tentativi non si va da nessuna parte il mio consiglio è di partire da qualcosa di semplice: apri il file binario per la scrittura (nome file costante), carichi la struttura (con solo un elemento int) da programma e poi chiudi il file. Lanci il programma e verifichi che il file venga creato e se è correttamente creato, la dimensione è corretta e aprendolo in binario riesci a riconoscere il tuo intero.
    Quando questo funziona ci aggiungi la gestione di argc/argv, oppure ci aggiungi un campo testo, oppure le altre cose che devi fare; parti però da qualcosa di semplice perchè il codice che hai scritto ha troppi punti oscuri!
  • Re: Programma c - problema segmentation fault

    @calendular
    Il file lo apre e chiude correttamente prima e dopo i fputs ()
    sprintf(str2,"%d",stud.esami);
    pf=fopen(*argv,"a+b");
    fputs(stud.nome,pf);
    //fprintf(pf,"nome: %s\ncognome: %s\nmatricola: %s\nesami sostenuti: %s\n",stud.nome,stud.cognome,str1,str2);
    fclose(pf);
    };
  • Re: Programma c - problema segmentation fault

    Hai verificato che il file venga creato? E hai controllato il contenuto?
  • Re: Programma c - problema segmentation fault

    Sicuramente va cambiato il primo parametro della fopen ()
  • Re: Programma c - problema segmentation fault

    Sicuramente va cambiato il primo parametro della fopen ()
    e perchè non lo fai? Comunque, se segui il mio consiglio, per ora passerei una stringa costante alla fopen().
  • Re: Programma c - problema segmentation fault

    Beh, e' valexor89 che ha il problema... vedrà lui come aggiustare il codice. Io ho dato solo un suggerimento
  • Re: Programma c - problema segmentation fault

    e' valexor89 che ha il problema... vedrà lui come aggiustare il codice. Io ho dato solo un suggerimento
    Scusami!!! Ho fatto confusione candaluar
  • Re: Programma c - problema segmentation fault

    Scusate se vi rispondo solo ora, comunque il programma ora funziona, il problema era esattamente l'uso errato di argv, per il resto ho usato fwrite ma anche con fputs ero riuscito a farlo funzionare grazie ancora siete stati molto disponibili
Devi accedere o registrarti per scrivere nel forum
17 risposte