2013-03-02 14 views
7

Attenzione:C++ avvertimento risolvere IStream :: tellg

warning C4244: 'initializing' : conversion from 'std::streamoff' to 'unsigned int', possible loss of data 

Causato da:

unsigned int FileSize = File.tellg(); // WARNING 
std::cout << "Size = " << FileSize << std::endl; 

Possibile soluzione? Va bene per fare questo:

// No more warnings but, is it safe? 
unsigned int FileSize = (unsigned int)File.tellg(); // OK? 
std::cout << "Size = " << FileSize << std::endl; 

ne dici di questo?

// No more warnings but, is it safe? 
unsigned int FileSize = static_cast< unsigned int >(File.tellg()); 
+0

Entrambe le soluzioni vanno bene. [Vi suggerisco di leggere i cast] (http://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast-and-reinterpret-cast-be-used) – Cornstalks

+0

Ok, volevo solo assicurarsi. – user2117427

+2

C'è un motivo per cui non vuoi 'std :: streamoff FileSize = File.tellg();'? – nobar

risposta

11

streamoff è un tipo integrale firmato definita dal vostro C++ implementazione della libreria standard, e abbastanza grande per soddisfare le maggiori dimensioni dei file possibili. Ad esempio, nel mio x86_64 stdlibC++, è un int64_t.

Al fine di evitare potenziali perdite di dati, utilizzare un tipo più grande o ... semplicemente lasciare che la variabile sia di tipo streamoff.

+0

Sto tentando di inizializzare la dimensione di un vettore. Il che significa che la dimensione non può essere negativa e steamoff può gestire interi positivi e negativi. – user2117427

+3

Se * la tua variabile * streamoff in realtà può essere negativa, allora devi * controllare * per quella condizione nel tuo codice. Il semplice fatto di trasmettere il tuo valore con segno negativo a uno senza firma causerà sempre problemi. – us2012

+0

Ok, facciamolo allora. – user2117427

Problemi correlati