File ad accesso sequenziale

frenky46
Salve ragazzi qualcuno potrebbe darmi una mano con il seguente programma ? purtroppo non ho capito un gran che dei file ad accesso sequenziale e sono in alto mare. Ho provato a scrivere qualcosa ma non credo vada bene :

Registrare su un file sequenziale un elenco degli studenti del corso riportante il cognome, nome, numero di 
matricola, numero di giorni di presenza al corso per ciascuno di essi, voto ottenuto in sede di esame. Una 
volta riempito il file, leggerne il contenuto e stamparlo. 

#include<stdio.h>
main ( )
{
FILE*Fmio;
char nome,cognome;
int matricola,giorni,voto;
Fmio=fopen("file1.txt","w"); //apre file in scrittura 
printf("nome:");
scanf("%c\n",&nome);
printf("cognome:");
scanf("%c\n",&cognome);
printf("matricola:");
scanf("%d\n",&matricola);
printf("giorni:");
scanf("%d\n",&giorni);
printf("voto:");
scanf("%d\n",&voto);

fprintf(Fmio,"%c %c %d %d %d\n",nome,cognome,matricola,giorni,voto); 

//ho sviluppato il punto considerando un solo allievo

printf("FINE SALVATAGGIO\n");
fclose(Fmio); 

Fmio=fopen("file1.txt","r");  //legge e stampa (soltanto il nome dell'allievo)
fscanf(Fmio,"%c",&nome);
if (!feof(Fmio))
{
printf("nome=%c \n", nome);
}
else printf("RAGGIUNTA FINE FILE");
fclose(Fmio);
}


come potete vedere non ho sviluppato il programma intero in quanto ho insicurezza, qualcuno può aiutarmi?

Risposte
apatriarca
Che dubbi hai esattamente? Che cosa non hai capito?

frenky46
Non so se è giusto ciò che ho fatto sino ad ora in particolare per quanto riguarda la stampa devo aggiungere tutte le variabili quali nome,cognome,matricola,giorno,voto e far ripetere tale operazione per ogni allievo ?

apatriarca
Siccome ti chiede di scrivere un elenco devi certamente inserire quel codice in un ciclo.

frenky46
Ti ringrazio per l'aiuto che hai deciso di darmi, credi che così possa andare bene ?

#include<stdio.h>
main ( )
{
FILE*Fmio;
char nome,cognome;
int matricola,giorni,voto,n;
Fmio=fopen("file1.txt","w"); //apre file in scrittura 

printf("Quanti allievi vuoi inserire?\n");
scanf("%d",&n);
for (i=0;i<n;i++)
	{
	printf("nome:");
	scanf("%c\n",&nome);
	printf("cognome:");
	scanf("%c\n",&cognome);
	printf("matricola:");
	scanf("%d\n",&matricola);
	printf("giorni:");
	scanf("%d\n",&giorni);
	printf("voto:");
	scanf("%d\n",&voto);

	fprintf(Fmio,"%c %c %d %d %d\n",nome,cognome,matricola,giorni,voto);
	}
printf("FINE SALVATAGGIO\n");
fclose(Fmio); 
Fmio=fopen("file1.txt","r"); 
fscanf(Fmio,"%c",&nome);
for (i=0;i<n;i++)
	{	
	if (!feof(Fmio))
		{
		printf("nome=%c \n", nome);
		printf("cognome=%c \n", cognome);
		printf("matricola=%d \n", matricola);
		printf("giorni=%d \n", giorni);
		printf("voto=%d \n", voto);
		}
	else printf("RAGGIUNTA FINE FILE");
	}
fclose(Fmio);
}

apatriarca
nome e cognome dovrebbero essere stringhe, non caratteri!! Per cui dovresti definirli come array di char e poi usare %s (possibilmente con anche la dimensione in mezzo ma ne parliamo nel caso più avanti..). Forse anche la matricola dovrebbe essere una stringa (in effetti in una delle due università che ho frequentato la matricola comprendeva anche un carattere non numerico). giorni e voto potrebbero poi essere definiti senza segno ma è secondario rispetto agli altri problemi. Corretti questi tipi direi che la scrittura su file è corretta. Il resto è invece sbagliato.. Devi infatti leggere il contenuto del file all'interno del ciclo, cosa che non stai per niente facendo..

frenky46
Purtoppo credo di non aver ben capito,così ora vanno bene nome e cognome ? La matricola nella nostra università è composta da 6/9 caratteri numerici quindi va bene come l'ho scritta io ?

Ho inserito la lettura del file nel ciclo, ma credo ci siano ancora problemi ...... :(

#include<stdio.h>
main ( )
{
FILE*Fmio;
char nome[20],cognome[20];
int matricola,giorni,voto,n;
Fmio=fopen("file1.txt","w"); //apre file in scrittura 

printf("Quanti allievi vuoi inserire?\n");
scanf("%d",&n);
for (i=0;i<n;i++)
	{
	printf("nome:");
	scanf("%s\n",&nome);
	printf("cognome:");
	scanf("%s\n",&cognome);
	printf("matricola:");
	scanf("%d\n",&matricola);
	printf("giorni:");
	scanf("%d\n",&giorni);
	printf("voto:");
	scanf("%d\n",&voto);

	fprintf(Fmio,"%s %s %d %d %d\n",nome,cognome,matricola,giorni,voto);
	}
printf("FINE SALVATAGGIO\n");
fclose(Fmio); 
for (i=0;i<n;i++)
	{	
	Fmio=fopen("file1.txt","r"); 
	fscanf(Fmio,"%c",&nome);
	if (!feof(Fmio))
		{
		printf("nome=%c \n", nome);
		printf("cognome=%c \n", cognome);
		printf("matricola=%d \n", matricola);
		printf("giorni=%d \n", giorni);
		printf("voto=%d \n", voto);
		}
	else printf("RAGGIUNTA FINE FILE");
	}
fclose(Fmio);
}

apatriarca
scanf("%s\n",&nome);

è sbagliata. Dovrebbe essere
scanf("%s\n", nome);

(senza & prima di nome). nome contiene infatti già l'indirizzo dell'inizio dell'array. Per il resto la prima parte va bene. La seconda è ancora sbagliata.

9 cifre dovrebbero starci in un int nelle comuni piattaforme a 32 o 64bit. Ma non c'è alcuna garanzia che funzioni su altri sistemi. Ma immagino tu te ne possa fregare..

frenky46
Ti ringrazio per l'aiuto che mi stai dando, il problema se funzioni o meno su altri sistemi come dicevi tu non ci interessa.

Per quanto riguarda la seconda parte , sapresti darmi una mano ? non riesco a capire come risolvere il problema. :-(

apatriarca
Come ti ho già detto, ad ogni ciclo devi leggere le informazioni contenute nel file. Inizia quindi ad avere un ciclo con all'interno gli fscanf (ne basterebbe uno in realtà) necessari a leggere i dati.

frenky46
Non so se ho ben capito a cosa ti riferivi, ti posto solo la seconda parte dell'esercizio, in questo modo dovrebbe leggere le informazioni del file o sbaglio ? :?

for (i=0;i<n;i++)
   {   
   Fmio=fopen("file1.txt","r"); 
   fscanf(Fmio,"%s %s %d %d %d\n",nome,cognome,matricola,giorni,voto);
   if (!feof(Fmio))
      {
      printf("nome=%s \n", nome);
      printf("cognome=%s \n", cognome);
      printf("matricola=%d \n", matricola);
      printf("giorni=%d \n", giorni);
      printf("voto=%d \n", voto);
      }
   else printf("RAGGIUNTA FINE FILE");
   }
fclose(Fmio);
}

apatriarca
No, il ciclo interno è completamente sbagliato. Quello esterno dovrebbe avere come condizione la fine del file.

frenky46
Scusa , non capisco cosa vuoi dire, di quale ciclo interno ed esterno parli ?

frenky46
Non riesco proprio a trovare una soluzione per la seconda parte, hai detto che devo far leggere il file nel ciclo : come ho fatto io non lo legge ?
Non puoi darmi un aiuto ?

apatriarca
if (!feof(Fmio))
      {
      printf("nome=%s \n", nome);
      printf("cognome=%s \n", cognome);
      printf("matricola=%d \n", matricola);
      printf("giorni=%d \n", giorni);
      printf("voto=%d \n", voto);
      }
   else printf("RAGGIUNTA FINE FILE");

Questa selezione non ha senso. La verifica di fine del file dovrebbe essere fatta nel ciclo e non qui.. Supponi infatti ad esempio che il precedente fscanf legga l'ultima riga e che quindi il file sia a questo punto terminato. Scriveresti RAGGIUNTA FINE FILE invece dei dati che hai appena letto. Piuttosto potresti verificare che scanf abbia restituito prima.
Fmio=fopen("file1.txt","r");

L'apertura del file dovrebbe essere fatta al di fuori del ciclo di lettura.
for (i=0;i<n;i++)

Qui andrebbe meglio qualcosa come
while(!feof(Fmio))

frenky46
Ti ringrazio per la risposta, allora vediamo se ho capito come correggere il tutto :

leggo il file fuori dal ciclo
Fmio=fopen("file1.txt","r"); 
for (i=0;i<n;i++)
   {   ......


correggo l'errore di scrittura inserendo while:
for (i=0;i<n;i++)
   {   
    do
      {
      fscanf(Fmio,"%s %s %d %d %d\n",nome,cognome,matricola,giorni,voto);
      printf("nome=%s \n", nome);
      printf("cognome=%s \n", cognome);
      printf("matricola=%d \n", matricola);
      printf("giorni=%d \n", giorni);
      printf("voto=%d \n", voto);
      }
    while(!feof(Fmio))
   }
fclose(Fmio);
}


come va ora ?

Grazie mille per l'aiuto che mi stai dando

apatriarca
No, il while doveva essere messo al posto del ciclo for.. Il ciclo for è inutile nel nuovo codice..

frenky46
quindi l'esercizio si conclude così ?
    do
      {
      fscanf(Fmio,"%s %s %d %d %d\n",nome,cognome,matricola,giorni,voto);
      printf("nome=%s \n", nome);
      printf("cognome=%s \n", cognome);
      printf("matricola=%d \n", matricola);
      printf("giorni=%d \n", giorni);
      printf("voto=%d \n", voto);
      }
    while(!feof(Fmio))
fclose(Fmio);
}

e se volessi aggiungere la scritta "Fine del file" devo farlo dopo il while ?

apatriarca
Utilizzerei un while al posto del do .. while, ma direi che è abbastanza corretto. Sì, per scrivere FINE DEL FILE devi inserire un printf fuori dal ciclo..

frenky46
grazie mille dell'aiuto

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