Newsgroup: it.comp.lang.c
Titolo: Acquisizione dati numerici da file

C'ho perso il sonno ormai :P
Ho un file di dati da acquisire e poi elaborare.. la situazione piu 
classica di sto mondo..ok... 
I dati sno organizzati cosě:
La prima riga č composta da un solo intero (50) che va letto e passato 
ad una funzione (o salvato su un altro file).
E fin qui ci siamo.
Dopodichč (a capo) ho 50 righe composte ciascuna da 100 coppie di valori 
double (quindi in tutto 200valori per riga). Ogni coppia č un punto 
sull'asse XY, quindi ogni riga rappresenta una curva.
Io dovrei acquisire tali dati riga per riga, creando una tabella fatta 
di due puntatoti a double, che contiene quindi le 100 coppie della riga.
Dopodichč devo elaborare i valori.
Ho provato ad usare fscanf, ma, dopo la corretta lettura del 50 
iniziale, sembra non vada a capo e non mi legge i dati sottostanti.
(ho aperto due canali separati in scrittura, uno per il 50 e uno per gli 
altri dati, per controllare se venivano letti correttamente.)
Ho provato fgets ma legge tutto, senza fermarsi alla fine della riga, e 
tra l'altro legge tutto come stringa, quindi poi dovrei convertire tutti 
i valori da char a double :\\\\
Insomma....booooooooooooooooooooooh...
Idee???
TNX!!!!!!!!!!!
-- 
Ragno
http://ragnazz.altervista.org

 tra l'altro legge tutto come stringa, quindi poi dovrei convertire tutti 
Su che piattaforma lavori?
Su che piattaforma è stato creato il file?
Come è stato creato?
Come lo hai trasferito dalla piattaforma di creazione alla tua?

 i valori da char a double :\\\\
...con fgets hai messo alla fine \n, mi sembra che legga tutta
la stringa.
poi la converti acquisisci con scanf %c caratteri %s stringa  %d numero %f
con virgola.
Se non sbaglio!
Ciao

Insomma....booooooooooooooooooooooh...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {double x, y; } double_pair_t;
typedef struct { int count; double_pair_t *items; } matrix_t;
typedef matrix_t *pmatrix_t;
pmatrix_t newmatrix(int count) {
   pmatrix_t result=malloc(sizeof *result);
   if (result) {
      result->count=count;
      result->items=malloc(count*sizeof *result->items);
   }       
   return result;
}
pmatrix_t readmatrix(const char *fname) {
   FILE *fp=fopen(fname, "rt");
   pmatrix_t result=0;
   if (fp) {
      char s[128]={0};
      int itemcount;     
      fgets(s, sizeof s, fp);
      if (((itemcount=atoi(s))) && 
          ((result=newmatrix(itemcount))) && result->items) {
         int i;                          
         for (i=0; i<itemcount && fgets(s, sizeof s, fp); i++) {
            double_pair_t p;              
            sscanf(s, "%Lf %Lf", &p.x, &p.y);
            result->items[i] = p;
         }
      }
      fclose(fp);     
   }
   return result;
}
void writematrix(pmatrix_t p) {
   int i;
   printf("item count = %d\n", p->count); 
   for (i=0; i<p->count; i++)
      printf("item[%d] = (x:%5.2f;y:%5.2f)\n", i, (p->items)[i].x,
(p->items)[i].y);
}
int main()
{
    pmatrix_t p=0;
 
    p = readmatrix("test.txt");
    writematrix(p);
    return 0;
}
Il file di test è siffatto:
5
1.23 -2.34
3.14 -1.0
-23.4  3.4
3.43  -1.02
2.34  3.45

 Come lo hai trasferito dalla piattaforma di creazione alla tua?
Copiato paro paro direi ;)
-- 
Ragno
http://ragnazz.altervista.org

 Se non sbaglio!
Si era che convertire 200 valori ogni volta mi sembrava un po' un 
"casino" inutile..ma se non c'è altra scelta...
-- 
Ragno
http://ragnazz.altervista.org

 2.34  3.45
Ellapeppola!! grazie!!!!!! ^____________________________^
-- 
Ragno
http://ragnazz.altervista.org

 2.34  3.45
Ti ringrazio di nuovo, il codice funzia alla grande... unico problema, 
legato alla mia spiegazione iniziale poco completa, č dato dal fatto che 
il mio file di dati č composto in modo un po' "bastardo", cioč č fatto 
cosě:
50 (e fin qui ok)
0.000 0.3456 0.100 1.45 0.200 1.89 etc....
Le mie coppie (x,y) sono cioč su una riga (x1:0.000, y1:0.3456) 
(x2:0.100 y2:1.45) etc.etc...
Ogni riga sono 100 coppie di valori (200 in tutto quindi)
Poi le righe in tutto sono 50 (e fin lě c'eravamo ;)).
Come faccio a far si che il codice si fermi a fine riga e non dopo 2 
valori? 
Non č necessario fare una struttura che tenga in memoria tutto il file.
Basta una che legga e memorizzi una riga.
Letta una riga faccio i "conti" che devo fare, poi riutilizzo il tutto 
per la 2a riga e cosi' via... 
(nel frattempo vedo anch'io se ci arrivo da solo, ma se ti va di darmi 
un altro consiglio...ben venga eeheheh)
-- 
Ragno
http://ragnazz.altervista.org

 Copiato paro paro direi ;)
i file di testo non si possono copiare paro paro. O li trasformi tu in 
qualche modo o usi un programma di trasferimento che gestisca 
correttamente il testo.
FTP è nato per questo.

 correttamente il testo.
Mi sa che uno dei problemi stia proprio li... provero' a trasformare il 
file di dati in un file di testo di win.... thanks!!
-- 
Ragno
http://ragnazz.altervista.org

 valori? 
Mi sembra piuttosto semplice: anziché usare una "pair", userai un array
allocato dinamicamente.  Ti lascio divertire.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 allocato dinamicamente.  Ti lascio divertire.
Uhm.. non so se il mio compilatore accetti array "dinamici"... (o erano 
array "variabli"...uhmm..)
Altre possibiltą? ;)
-- 
Ragno
http://ragnazz.altervista.org

 > allocato dinamicamente.  Ti lascio divertire.
Altrochč divertimento...ci sto diventando matto... hai mica voglia di 
darmi un consiglio piů.... operativo? ^________^
-- 
Ragno
http://ragnazz.altervista.org

array "variabli"...uhmm..)
Io ho scritto "array allocato dinamicamente", non "array dinamico".
Sfoglia un manuale di C.

darmi un consiglio piů.... operativo? ^________^
No, non ne ho voglia.  D'altronde ti ho praticamente scritto tutto il
codice.

 codice.
Ecc'hai ragione... e hai fatto bene, alla fine ne sono uscito ;)))
Grazie mille ! ;))
-- 
Ragno
http://ragnazz.altervista.org

Ecc'hai ragione... e hai fatto bene, alla fine ne sono uscito ;)))
Bravo ragazzo, sapevo che ce l'avresti fatta ;)

 Bravo ragazzo, sapevo che ce l'avresti fatta ;)
Azzie;)
Ovviamente poi sono incappato in altri problemini... ma meglio aprire un 
altro 3D per non fare casino ;)
-- 
Ragno
http://ragnazz.altervista.org