2013-03-02 14 views
7

Ostrzeżenie:C++ ostrzeżenie rozwiązywania istream :: tellg

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

Spowodowany przez:

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

Możliwe rozwiązanie? Czy można to zrobić:

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

Co z tym?

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

Oba rozwiązania są w porządku. [Sugeruję, żebyś czytał o castach] (http://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast-and-reinterpret-cast-be-used) – Cornstalks

+0

OK, po prostu chciałem upewniać się. – user2117427

+2

Czy istnieje powód, dla którego nie chcesz 'std :: streamoff FileSize = File.tellg();'? – nobar

Odpowiedz

11

streamoff jest podpisana integralną typ zdefiniowany przez C++ standardowej implementacji biblioteki i wystarczająco duże, aby zaspokoić największych możliwych rozmiarów plików. W moim x86_64 stdlibC++ na przykład jest to int64_t.

Aby uniknąć potencjalnej utraty danych, użyj większego typu lub ... po prostu pozwól, aby zmienna była typu streamoff.

+0

Próbuję zainicjować rozmiar wektora. Co oznacza, że ​​rozmiar nie może być ujemny, a odparowanie może obsługiwać ujemne i dodatnie liczby całkowite. – user2117427

+3

Jeśli * zmienna * streamoff może w rzeczywistości być ujemna, musisz * sprawdzić * dla tego warunku w kodzie. Po prostu odrzucenie negatywnej wartości podpisu na niepodpisaną spowoduje zawsze problemy. – us2012

+0

OK, możemy to zrobić. – user2117427

Powiązane problemy