PDA

Visualizza la versione completa : [C] Ciclo di lettura fino alla fine di un file di input


miscialo
19-01-2007, 11:39
salve... ho un dubbio... come si impone che un ciclo for di lettura venga eseguito fino alla fine di un file di input?eof

oregon
19-01-2007, 11:40
Cosa usi per leggere dal file? Che tipo di lettura stai facendo?

In genere non si usa il for ma un do ... while ...

miscialo
19-01-2007, 11:45
devo leggere dal file valori di tipo int...devo mettere come impostazione che se il file termina..il ciclo for che mi fa leggere questi valori si interrompa...

oregon
19-01-2007, 11:51
Un ciclo for presuppone che tu sappia quanti sono i dati da leggere e questi siano certamente presenti ... anche se puoi comunque usarlo - ripeto - e' piu' "logico" usare il do while ...

Hai scritto del codice per l'apertura e la lettura del file o no?

miscialo
19-01-2007, 11:55
il codice è questo...

n è un numero che viene anchesso letto...ma se i dati che ci sono nel file sono inferiori a n il ciclo ripete dall'inizio...io voglio che si interrompa...


for (f=0;f<n;f++)
{
fgets (s,30,fp);
sscanf (s,"%d %d %d %d\r\n", &mat[f][0],&mat[f][1],&mat[f][2],&vet[f]);
}

andbin
19-01-2007, 12:07
Originariamente inviato da miscialo
io voglio che si interrompa...
for (f=0;f<n && !feof (fp);f++)
....

oregon
19-01-2007, 12:16
Oppure


if(!fgets(s, 30, fp)) break;

miscialo
19-01-2007, 12:23
quando vado a stampare mi stampa dei numeri strani alla fine...penso che consideri i segnaposti...ho provato amettere il blocco di fine file al ciclo di stampa e mi da errore...





/*Leggi n*/
fgets (s,30,fp);
sscanf (s,"%d",&n);


/*Leggi la matrice della locazione + la massa*/
for (f=0;f<n;f++)
{
fgets (s,30,fp);
sscanf (s,"%d %d %d %d\r\n", &mat[f][0],&mat[f][1],&mat[f][2],&vet[f]);
}

miscialo
19-01-2007, 13:05
questo è il mio programma...se metto for (f=0;f<n && !feof (fp);f++) nella funzione fget_point_mass , la lettura si ferma e questo va bene...però la funzione fwrite_point_mass utilizzando anchessa un ciclo continua a stampare...se metto for (f=0;f<n && !feof (fp);f++) in fwrite_point_mass il prompt mi da errore...cosa dovrei fare secondo voi??


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

#define DIM_LOC 3
#define N_MAX 10

int fget_point_mass (int n, int mat[][DIM_LOC], int vet[]);
void center_grav (int n, int mat[][DIM_LOC], int vet[], float &cx, float &cy, float &cz);
void fwrite_point_mass (int n, int mat[][DIM_LOC], int vett_masse[], float cx, float cy, float cz);

int main (void)
{

int vett_masse[N_MAX];
int mat[N_MAX][DIM_LOC];
int f,n;

float cx = 0, cy = 0, cz = 0;

n = fget_point_mass (n, mat, vett_masse);

if (!n)
{
system ("pause");
return 0;
}

center_grav (n, mat, vett_masse, cx, cy, cz);

fwrite_point_mass(n, mat, vett_masse, cx, cy, cz);

system("pause");
return(0);
}


//Definizione funzioni
int fget_point_mass(int n, int mat[][DIM_LOC], int vet[])
{
int f;
FILE *fp;
char s [30];

fp = fopen ("points.dat","r");
if (fp == NULL)
{
printf ("File di database non trovato, nessun dato caricabile.\n");
return 0;
}

/* Leggi la prima riga (n = numero di elementi) */
fgets (s,30,fp);
sscanf (s,"%d",&n);
if ((n < DIM_LOC)||(n > N_MAX))
{
printf (" E' presente un errore. Controllare il file di input.\n");
return 0;
}

/*Leggi la matrice della locazione + la massa*/
for (f=0;f<n;f++)
{
fgets (s,30,fp);
sscanf (s,"%d %d %d %d\r\n", &mat[f][0],&mat[f][1],&mat[f][2],&vet[f]);
}
return n;
}


void center_grav (int n, int mat[][DIM_LOC], int vet[], float &cx, float &cy, float &cz)
{
int f;
float totmasse = 0;
float c1 = 0, c2 = 0, c3= 0;

for (f = 0; f < n; f++) {
totmasse = totmasse + vet[f];
c1 = c1 + (vet[f] * mat[f][0]);
c2 = c2 + (vet[f] * mat[f][1]);
c3 = c3 + (vet[f] * mat[f][2]);
}
cx = (1/totmasse)*(c1);
cy = (1/totmasse)*(c2);
cz = (1/totmasse)*(c3);
}

void fwrite_point_mass (int n, int mat[][DIM_LOC], int vett_masse[], float cx, float cy, float cz)
{
int f;

/*Stampa la locazione*/
printf (" Locazione:\n");
for (f=0;f<n;f++) printf (" %d %d %d \n\n", mat[f][0],mat[f][1],mat[f][2]);

/*Stampa la massa*/
printf (" Masse:\n\n");
for (f=0;f<n;f++) printf (" %d\n\n", vett_masse[f]);

/* Stampare il numero n */
printf (" n:\n %d\n\n", n);

/*Stampa in centro di gravità*/
printf ("Il centro di gravita' C e' ( %.3f, %.3f, %.3f )\n\n" , cx, cy, cz );
}

andbin
19-01-2007, 13:13
Originariamente inviato da miscialo
però la funzione fwrite_point_mass utilizzando anchessa un ciclo continua a stampare...In che senso continua a stampare?! "Quanto" stampare è determinato da 'n'.


Originariamente inviato da miscialo
se metto for (f=0;f<n && !feof (fp);f++) in fwrite_point_mass il prompt mi da errore...cosa dovrei fare secondo voi??Beh, certo, in fwrite_point_mass non hai fp, non usi alcun file.

Tra l'altro a fget_point_mass passi un valore 'n' che non serve, infatti 'n' è in output, non in input.

Loading