PDA

Visualizza la versione completa : [C++] intero più grande


Luciano79
16-06-2009, 14:38
Ciao a tutti,
esiste un modo per caricare in una variabile un numero più grande di un long?
Devo dire ad un programma di posizionarsi tramite fseek ad un certo byte di un file di circa 3gb...
grazie!

YuYevon
16-06-2009, 14:58
Penso ti basi un unsigned int che ti consente di arrivare fino a 4294967295, che per un file di 3 GB dovrebbe bastare.

In alternativa ci sarebbe il long long int, intero su 8 byte (quindi ben oltre i 3 miliardi), che mi pare sia standard...

Luciano79
16-06-2009, 15:07
la variabile è dichiarata unsigned long, ma non riesco ad associarle un numero superiora ai 2gb (come se fosse una semplice long).
Il compilatore (Microsoft) non mi accetta la dichiarazione long long int...

Stoicenko
16-06-2009, 15:08
che compilatore usi vc++ 2005 o 2008? usa longlong

Luciano79
16-06-2009, 15:12
Originariamente inviato da Stoicenko
che compilatore usi vc++ 2005 o 2008? usa longlong

ehm... :fagiano: 6.0

XWolverineX
16-06-2009, 15:23
Passa al 2008 express e usa __int64

MItaly
16-06-2009, 15:23
fseek accetta un parametro di tipo long (con segno, visto che fseek consente anche spostamenti relativi), che in VC++ è a 32 bit. Questo significa che in un solo colpo non ti puoi muovere oltre i 2 GB, ma puoi provare a vedere se puoi risolvere con due fseek:


fseek(fp,2147483647,SEEK_SET);
fseek(fp,1073741825,SEEK_CUR);
.

Luciano79
16-06-2009, 15:33
Originariamente inviato da MItaly
fseek accetta un parametro di tipo long (con segno, visto che fseek consente anche spostamenti relativi), che in VC++ è a 32 bit. Questo significa che in un solo colpo non ti puoi muovere oltre i 2 GB, ma puoi provare a vedere se puoi risolvere con due fseek:


fseek(fp,2147483647,SEEK_SET);
fseek(fp,1073741825,SEEK_CUR);
.
grazie MItaly, questa è un problema che ancora non ho affrontato, sicuramente ne avrò bisogno nel programma. Ora però devo risolvere il problema iniziale: come faccio a inserire in una variabile un numero superiore a 2147483647?

Se non si può mi hai comunque fatto venire in mente un'altra possibile strada:
per il momento leggo il file di input e ogni tanto memorizzo in una variabile il numero di byte corrente che mi calcolo facendo una somma dei bite letti ad ogni lettura


fread(Var,LenRecord,1,fpi);
ByteLetti+=LenRecord;

al posto di contare i byte che leggo facendo una somma, posso ottenere la posizione corrente del puntatore nel file di input?

MItaly
16-06-2009, 15:43
Originariamente inviato da Luciano79
grazie MItaly, questa è un problema che ancora non ho affrontato, sicuramente ne avrò bisogno nel programma. Ora però devo risolvere il problema iniziale: come faccio a inserire in una variabile un numero superiore a 2147483647?
Devi usare un unsigned long, oppure, se non ti interessa avere il numero esatto, un double.
Comunque il tipo standard per le dimensioni degli oggetti è size_t.
---EDIT---
In ogni caso da quanto leggo in giro VC++ 6 supporta gli interi a 64 bit, prova il tipo __int64.

Luciano79
16-06-2009, 16:02
Originariamente inviato da MItaly
Devi usare un unsigned long

...lo sono già sia ByteLetti che LenRecord. Nella mia ignoranza e preso dal panico ho trasformato tutti i long in unsigned long.


Originariamente inviato da MItaly
, oppure, se non ti interessa avere il numero esatto, un double.

...purtroppo il numero deve essere esatto.


Originariamente inviato da MItaly
Comunque il tipo standard per le dimensioni degli oggetti è size_t.

.... non capisco il significato della tua frase, ma provo a fare una ricerca per capire...


Originariamente inviato da MItaly
In ogni caso da quanto leggo in giro VC++ 6 supporta gli interi a 64 bit, prova il tipo __int64.
...tra poco lo provo e ti saprò dire

grazie!!!

Loading