Fseek e fwrite in una funzione

di il
12 risposte

Fseek e fwrite in una funzione

Salve a tutti,
ho un problema con le funzioni fseek e fwrite in una funzione. Spiego bene il problema: ho un programma che dovrebbe gestire un elenco di attrezzi in magazzino e dal main richiamo per ogni scelta dell'utente la funzione opportuna. Appena scelgo "1" per creare un file con record nulli la fwrite mi da un segmentation fault già alla prima invocazione nel for. Stranamente se trasferisco le righe della funzione initialize direttamente nel main l'azione va a buon fine.

#include<stdio.h>

/*Esercizio 11.12 Deitel:
Inventario dell'hardware*/

void menu(short*);
void initialize (FILE*);
void newrecord (FILE*);
void view (FILE*);
void deleterecord (FILE*);
void updaterecord (FILE*);




struct record {
	int ncont;
	char name[15];
	int pz;
	float price;
	};

int main(){

short option;
FILE *source;

source=fopen("hardware.dat", "rb+");

if (source==NULL){
	printf("Errore nell'apertura del file\n");
	return 1;
	}

menu(&option);

switch (option){
	case 1:
		initialize(source);
		break;
	case 2:
		newrecord(source);
		break;
	case 3:
		view(source);
		break;
	case 4:
		deleterecord(source);
		break;
	case 5:
		updaterecord(source);
		break;
	default:
		printf("Grazie per aver usato il programma\n");

	};


fclose(source);
return 0;

}

void menu(short *choice){

printf("%20s\n", "-------------------------");
printf("Inventario dell'Hardware\n");
printf("%20s\n\n", "-------------------------");

printf("Scegli una delle seguenti opzioni:\n");
printf("[1] Inizializza il documento vuoto\t");
printf("[2] Inserisci un nuovo attrezzo\n");
printf("[3] Mostra gli attrezzi\t");
printf("[4] Elimina un attrezzo\n");
printf("[5] Modifica un attrezzo\t");
printf("[any] Esci dal programma\n\n?");

scanf("%d", choice);
}



void initialize (FILE *file){

struct record emptyrecord={ 0, "", 0, 0.0 };  /*inizializza un record vuoto*/
int i;


for (i=1; i<=100; i++){
	fwrite(&emptyrecord, sizeof(struct record), 1, file);
	}

}

Lo stesso segmentation fault mi viene restituito anche con le altre funzioni. Ciò che proprio non mi spiego è perchè ottengo questi errori anche se ho seguito uno schema di un altro programma simile che gira bene sullo stesso pc.
Vi lascio in allegato il mio codice completo e quello del programma proposto dal libro di testo (Deitel).


Sarò immensamente grato a chi voglia rispondermi visto che fra pochi giorni ho un esame e vorrei padroneggiare bene l'accesso casuale ai file con il C.

Buonasera,
Riccardo.
Allegati:
Codice del libro di testo (Deitel pag. 437).
Codice del libro di testo (Deitel pag. 437).

Mio codice del programma che non va.
Mio codice del programma che non va.

12 Risposte

  • Re: Fseek e fwrite in una funzione

    Per cominciare utilizza un int per la variabile choice dato che hai usato %d nella scanf
  • Re: Fseek e fwrite in una funzione

    Devi sostituire initialize(FILE *) con initialize(FILE**)

    e richiamarla con initialize( &source ).


    il perché è un po' complicato ma se ti farai uno schema della memoria (stack heap ecc) lo capirai.
  • Re: Fseek e fwrite in una funzione

    Anh si ovviamente all'interno della funzione devi cambiare la fwrite(, , , source) con fwrite(,,,*source)
  • Re: Fseek e fwrite in una funzione

    Devi sostituire initialize(FILE *) con initialize(FILE**)
    e richiamarla con initialize( &source ).
    il perché è un po' complicato ma se ti farai uno schema della memoria (stack heap ecc) lo capirai.
    Ho seguito i tuoi consigli, ovviamente ho modificato la fwrite come dici, però non risolvo. L'errore è sempre lo stesso: segmentation fault. Poi non capisco quello che mi hai proposto: per quel che so fwrite richiede un puntatore a file che di solito si passa sempre come ho fatto, perchè appunto così passo il valore del puntatore, che è in pratica l'indirizzo del file. Dal qual che capisco della tua soluzione, invece, starei passando alla funzione l'indirizzo della variabile puntatore 'source', che non è più l'indirizzo del file.
    E' vero che nella fwite poi metto *file (che è il nome di source in initialize) e quindi in teoria torno a puntare al file, però mi sembra un po' contorto.

    Saresti così gentile da spiegarti meglio?
  • Re: Fseek e fwrite in una funzione

    Hai completamente ignorato il mio suggerimento ...
  • Re: Fseek e fwrite in una funzione

    No, ho seguito anche quello! Ho sostituito short con int come hai detto. Putroppo continua a non andare.
  • Re: Fseek e fwrite in una funzione

    Quando hai problemi esattamente?
  • Re: Fseek e fwrite in una funzione

    Ha problemi quando incontra una fseek o una fwite, in qualsiasi delle funzioni che ho inserito
  • Re: Fseek e fwrite in una funzione

    Sono dell'idea che se ascolti il consiglio di @oregon il tuo problema scomparirà magicamente.
    cambia "short option" in "int option"
  • Re: Fseek e fwrite in una funzione

    E rimetti a posto FILE * che andava bene... Facci sapere. Eventualmente posta tutto il codice più recente.
  • Re: Fseek e fwrite in una funzione

    Scusate poco dopo il codice che ho postato originariamente avevo aggiunto una funzione che utilizzava option passata allo stesso modo della funzione menu: avevo corretto il fatto dell'int lì al primo suggeriemto di oregon e avevo completamente dimenticato di aver creato un'altra funzione con lo stesso errore. Ho corretto anche quella e adesso -proprio magicamente- funziona . Ringrazio tutti e mi scuso per avervi tenuto più del necessario in questa discussione per una mia svista.

    P.S. Se a qualcuno va di spiegare come mai quell'errore abbia pregiudicato completamente il resto del programma sarò felice di ascoltare
  • Re: Fseek e fwrite in una funzione

    La magia non c'entra ... se tu predisponi uno short (2 byte) e con la scanf scrivi un int (4 byte), i dati in più sporcano lo stack con relativo crash.
Devi accedere o registrarti per scrivere nel forum
12 risposte