Neden stringstream >> hedef değer hatası değiştirmek?
Stroustrup gelen TC PL, 3rd Edition, Bölüm 21.3.3:
Eğer biz denemek okuma içine bir değişken v ve işlem başarısız olur, değeri v olmalı değişmeden (değişmeden eğer v Bir tür tarafından ele ıstream veya başka üye fonksiyonlar).
Aşağıdaki örnek, yukarıdaki alıntı çeliştiği görülüyor. Yukarıdaki alıntı dayanarak, v değeri değişmeden -- kalmasını bekliyordum ama sıfırlanmış olur. Bu bariz çelişkili davranışın açıklaması nedir?
#include <iostream>
#include <sstream>
int main( )
{
std::stringstream ss;
ss << "The quick brown fox.";
int v = 123;
std::cout << "Before: " << v << "\n";
if( ss >> v )
{
std::cout << "Strange -- was successful at reading a word into an int!\n";
}
std::cout << "After: " << v << "\n";
if( ss.rdstate() & std::stringstream::eofbit ) std::cout << "state: eofbit\n";
if( ss.rdstate() & std::stringstream::failbit ) std::cout << "state: failbit\n";
if( ss.rdstate() & std::stringstream::badbit ) std::cout << "state: badbit\n";
return 1;
}
Kullanarak aldığım çıktı-w64-mingw32-g x86_64 .exe (rubenvb-4.7.2-release) 4.7.2
Before: 123
After: 0
state: failbit
Teşekkürler.
CEVAP
Çıkarma başarısız örneğin, eğer bir harf bir rakam beklenen girilmemişse), değeri değiştirilmeden bırakılır ve failbit ayarlanmışsa (C 11 kadar)
Eğer çıkarma başarısız olursa, sıfır değeri yazılır ve failbit ayarlanmışsa. Eğer sonuçlar çıkarma değeri çok büyük ya da çok küçük uyum değeri, std::numeric_limits::max() veya std::numeric_limits::min() yazılı ve failbit bayrağı ayarlanmış. (C 11'den beri)
Derleyici davranış değişiklikleri hangi modu, C 11 derleme gibi görünüyor.
Giriş operatörü do_get
çağırır kimin std::num_get
model yerel ayarı kullanır. C 11 std::strtoll
et kullanmak için belirtilen. al. tip fonksiyonları. C 11 önce anlaşılan std::scanf
stil ayrıştırma (referans alarak C 03 belirtimi için erişim yok) numaraları ayıklamak için kullanılır. Davranış değişikliği giriş ayrıştırma bu değişiklikten kaynaklanmaktadır.
Neden bu program geçerli mi? Bir sözdi...
Neden @font-face woff dosyaları 404 ha...
Neden't Java imzasız değer vermez...
Aslında bir Yığın Taşma hatası neden o...
PHP, neden&;/> script lt; ayrıştırma...