2013-03-02 13 views
7

Uyarı:C++ çözme istream :: tellg uyarı

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

Olası çözümü:

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

Yarattığı? Bu nasıl hakkında

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

: bunu yapmak tamam mı?

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

Her iki çözüm de sorun değil. [Alıntıları okumanızı tavsiye ederim] (http://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast-and-reinterpret-cast-be-used) – Cornstalks

+0

Tamam, sadece istedim emin olmak. – user2117427

+2

İstediğiniz bir neden var mı? Std :: streamoff FileSize = File.tellg(); '? – nobar

cevap

11

streamoff sizin C++ standart kütüphane uygulaması ve mümkün olan en büyük dosya boyutları karşılamak için yeterli büyüklükte tanımlanan imzalı ayrılmaz bir türüdür. Benim x86_64 stdlibC++ örneğimde, int64_t.

Potansiyel veri kaybını önlemek için daha büyük bir yazı tipi kullanın ... veya değişkeninizi streamoff şeklinde yazın.

+0

Bir vektörün boyutunu başlatmaya çalışıyorum. Bu, boyutun negatif olamayacağı ve olumsuzlukların negatif ve pozitif tam sayılarla başa çıkabileceği anlamına gelir. – user2117427

+3

* Streamoff değişkeniniz aslında negatif olabilirse, kodunuzdaki bu koşul için * kontrol etmeniz gerekir. Negatif imzalı değerinizi imzasız birine dökmek her zaman sorunlara yol açacaktır. – us2012

+0

Tamam, o zaman yapalım. – user2117427