C - scrivere in struct da file
Buongiorno, in un file dat ho un intero N nella prima riga, che vorrei fosse la dimensione del vettore di struct, e sotto N righe, ciascuna delle quali con 5 informazioni (m, x, y, vx, vy). Vorrei scrivere queste informazioni in una struct. Quello che ho fatto è:
con le righe di stampa vedo che viene preso correttamente il valore di N, ma per tutti gli altri N * 5 valori viene stampato uno 0. Credo che il problema sia nell'utilizzo di fscanf, ma non capisco dove; ho anche provato a sostituire l'utilizzo delle variabili temporanee con fscanf(dat, "%f %f %f %f %f", &(p.m), &(p.x), &(p.y), &(p.vx), &(p.vy));
ma non cambia niente.
Grazie a chi vorrà aiutarmi
#include <stdio.h> #include <stdlib.h> #include <math.h> typedef struct { double m; double x, y; double vx, vy; } particle; int main () { FILE * dat; dat=fopen("lj3.dat", "r"); int N; int i; particle p[N]; fscanf(dat, "%d", &N); // p = calloc(N, sizeof(particle)); double m, x, y, vx, vy; for (i=0; i<N; i++) { fscanf(dat, "%f %f %f %f %f", &m, &x, &y, &vx, &vy); p[i].m=m; p[i].x=x; p[i].y=y; p[i].vx=vx; p[i].vy=vy; } printf("%d\n", N); for (i=0; i<N; i++) { printf("%f %f %f %f %f\n", p[i].m, p[i].x, p[i].y, p[i].vx, p[i].vy); } fclose(dat); return(0); }
con le righe di stampa vedo che viene preso correttamente il valore di N, ma per tutti gli altri N * 5 valori viene stampato uno 0. Credo che il problema sia nell'utilizzo di fscanf, ma non capisco dove; ho anche provato a sostituire l'utilizzo delle variabili temporanee con fscanf(dat, "%f %f %f %f %f", &(p.m), &(p.x), &(p.y), &(p.vx), &(p.vy));
ma non cambia niente.
Grazie a chi vorrà aiutarmi
Risposte
Usare una variabile non inizializzata per la dimensione di un array è sbagliato. Devi usare l'allocazione dinamica in questo caso.
Intanto grazie della risposta.
Quindi dovrei fare così?
Il problema è che ho comunque la stampa di soli zeri, come nell'altro caso..
Quindi dovrei fare così?
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> typedef struct { double m; double x, y; double vx, vy; } particle; int main () { FILE * dat; dat=fopen("lj3.dat", "r"); int N; int i; particle* p; fscanf(dat, "%d", &N); p = calloc(N, sizeof(particle)); double m, x, y, vx, vy; for (i=0; i<N; i++) { fscanf(dat, "%f %f %f %f %f", &m, &x, &y, &vx, &vy); p[i].m=m; p[i].x=x; p[i].y=y; p[i].vx=vx; p[i].vy=vy; } printf("%d\n", N); for (i=0; i<N; i++) { printf("%f %f %f %f %f\n", p[i].m, p[i].x, p[i].y, p[i].vx, p[i].vy); } fclose(dat); return(0); }
Il problema è che ho comunque la stampa di soli zeri, come nell'altro caso..
@loref96: ti ho modificato i post in modo da usare il tag code per vedere il codice senza formattazioni. Altrimenti cose come [ i ] vengono interpretati come corsivo.
Nello [tt]scanf[/tt], il tipo [tt]double[/tt] è rappresentato da [tt]%lf[/tt] e non da [tt]%f[/tt] come nel tuo codice (come puoi vedere per esempio in questo reference). Nel caso di printf entrambe le stringhe funzionano correttamente.
Grazie, ora funziona! Per il futuro, come posso scrivere il messaggio in modo che la formattazione venga conservata, come nella tua forma modificata? C'è una guida da qualche parte sul sito?
"loref96":
Grazie, ora funziona! Per il futuro, come posso scrivere il messaggio in modo che la formattazione venga conservata, come nella tua forma modificata? C'è una guida da qualche parte sul sito?
Basta che usi (code) e (/code)
con le parentesi quadre
