C - scrivere in struct da file

Messaggioda loref96 » 23/03/2020, 11:20

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 è:

Codice:
#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[i].m), &(p[i].x), &(p[i].y), &(p[i].vx), &(p[i].vy));
ma non cambia niente.
Grazie a chi vorrà aiutarmi
loref96
Starting Member
Starting Member
 
Messaggio: 12 di 38
Iscritto il: 04/07/2019, 18:11

Re: C - scrivere in struct da file

Messaggioda vict85 » 23/03/2020, 12:55

Usare una variabile non inizializzata per la dimensione di un array è sbagliato. Devi usare l'allocazione dinamica in questo caso.
vict85
Moderatore
Moderatore
 
Messaggio: 10102 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: C - scrivere in struct da file

Messaggioda loref96 » 23/03/2020, 15:13

Intanto grazie della risposta.
Quindi dovrei fare così?
Codice:
#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
Starting Member
Starting Member
 
Messaggio: 13 di 38
Iscritto il: 04/07/2019, 18:11

Re: C - scrivere in struct da file

Messaggioda apatriarca » 23/03/2020, 19:54

@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.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5383 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: C - scrivere in struct da file

Messaggioda apatriarca » 23/03/2020, 20:04

Nello scanf, il tipo double è rappresentato da %lf e non da %f come nel tuo codice (come puoi vedere per esempio in questo reference). Nel caso di printf entrambe le stringhe funzionano correttamente.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5384 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: C - scrivere in struct da file

Messaggioda loref96 » 24/03/2020, 09:21

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
Starting Member
Starting Member
 
Messaggio: 14 di 38
Iscritto il: 04/07/2019, 18:11

Re: C - scrivere in struct da file

Messaggioda Umby » 24/03/2020, 11:56

loref96 ha scritto: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 :smt023
Umby
Advanced Member
Advanced Member
 
Messaggio: 1639 di 2313
Iscritto il: 01/11/2008, 16:50
Località: Napoli


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite