PDA

View Full Version : [C] Leggere file sotto Linux


salvodel
18-12-2007, 11:07
Salve a tutti
ho scritto un programmino con MS Visual C++ per leggere un file. Successivamente ho eseguito lo stesso listato sotto Linux ma non ottengo lo stesso risultato. Tranne il primo valore del primo vettore tutti gli altri risultano sballati. La riga fondamentale è la seguente che funziona a meraviglia sotto win
while(fscanf(fp,"%LE %LE %LE %LE %LE %LE",&time[i],&mat1[i],....,&matx[i])>0)
Cosa devo modificare per renderlo funzionante?:confused:
Grazie

andbin
18-12-2007, 11:17
Cosa devo modificare per renderlo funzionante?:confused: Ma le varie variabili che ricevono i valori sono di tipo long double?

salvodel
18-12-2007, 11:47
Ma le varie variabili che ricevono i valori sono di tipo long double?

In che senso? Nel senso se ho definito double temp[1000]?
Prima riga del file dati.dat:
0.00000E+00 0.00000E+00 0.36077E+01 0.00000E+00 0.47400E+02 0.39976E+01 0.90246E+00

while(fscanf(fp,"%E %E %E %E %E %E %E",&temp1[i],...,&temp7[i])>0)
Questo è l'output
temp[0]= 0.000000E+00
temp[1]= 5.164076E-315
temp[2]= 5.205521E-315
temp[3]= 5.230388E-315
temp[4]= -3.147250E-39
temp[5]= 5.263544E-315
temp[6]= 5.271833E-315
temp[7]= 5.280122E-315


Se faccio
while(fscanf(fp,"%LE %LE %LE %LE %LE %LE %LE",&temp1[i],...,&temp7[i])>0)
Questo è l'output

temp[0]= -0.000000E+00
temp[1]= -7.988564E+2863
temp[2]= -7.988564E+2863
temp[3]= -5.991423E+2863
temp[4]= -7.988564E+2863
temp[5]= -4.992853E+2863
temp[6]= -5.991423E+2863
temp[7]= -6.989994E+2863

andbin
18-12-2007, 12:18
In che senso?%E è per un double, %LE è per un long double.
long double non è la stessa cosa di double, sono due tipi di dato diversi (dove long double è chiaramente più esteso del double).

salvodel
18-12-2007, 12:35
%E è per un double, %LE è per un long double.
long double non è la stessa cosa di double, sono due tipi di dato diversi (dove long double è chiaramente più esteso del double).
Su questo ci sono ma non cambia la solfa. Inoltre perche sotto windows funziona alla grande mentre sotto linux come vedi dagli esempi che ti ho postato legge correttamente solo il primo valore?:muro:
Grazie

salvodel
18-12-2007, 12:45
Ho provato a dichiarare i vettori come variabili float ed adesso va:confused: .
Perche c'è questa differenza con windows:confused: ?
Se però volessi utilizzare i double come dovrei fare:confused: ?
Grazie

Invece di diminuire le domande qui aumentano :D

andbin
18-12-2007, 12:49
Su questo ci sonoTra l'altro mi sono sbagliato: nelle Xscanf %E è per un float, %lE (l minuscola) è per un double e %LE (L maiuscola) è per un long double.
Se hai messo lo specificatore corretto per il tipo di dato delle variabili, non vedo problemi, su Win o Linux che sia (non ho provato, chiaramente).

salvodel
18-12-2007, 13:49
Tra l'altro mi sono sbagliato: nelle Xscanf %E è per un float, %lE (l minuscola) è per un double e %LE (L maiuscola) è per un long double.
Se hai messo lo specificatore corretto per il tipo di dato delle variabili, non vedo problemi, su Win o Linux che sia (non ho provato, chiaramente).

Hai perfettamente ragione. Mi avevano consigliato di mettere %LG o %LE e avevo visto solo il significato di E e G maiuscole minuscole.:muro:
Ora funziona anche il double con %lE...solo che non mi gira quello con l'allocazione dinamica se utilizzo double al posto di float.

Perche?:confused: :muro: :muro: :muro: