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
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...
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]);
}
Originariamente inviato da miscialo
io voglio che si interrompa...
for (f=0;f<n && !feof (fp);f++)
....
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 );
}
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.