Soru ifstream: başarıyla açılmışsa kontrol edin


Bir meslektaşım bana şu kodu söyledi:

std::ifstream stream(filename.c_str());
if (!stream)
{
    throw std::runtime_error("..");
}

yanlış olur. Dedi ifstream Açılış başarılı olursa 0 olarak değerlendirir. Kodum işe yarıyor, ancak belgeleri bulmak istedim ama açılışın başarılı olup olmadığını nasıl kontrol edeceğini söylemedim. Bana işaret edebilir misin?


25
2017-11-17 16:41


Menşei




Cevaplar:


operator!  aşırı yüklendi için std::ifstream, yani sen kutu Bunu yap.

Benim görüşüme göre, bu, aşırı yüklenmenin (standartlar komitesi tarafından) korkunç bir şekilde kötüye kullanılmasıdır. Eğer kontrol edersen, kontrol ettiğin şey daha açık. if (stream.fail()).


34
2017-11-17 16:45



kontrol etmeyi unutma stream.bad(), stream.good(), stream.fail(), ve stream.is_open(). iç çekmek... - Inverse
! 'başarısız' ve 'kötü' kontrol etmek için aşırı yüklendi - Martin Beckett
Burada "istismar" yoktur. - Lightness Races in Orbit
Ben aslında başarısız olduğunu düşünüyorum Daha Operatörlerden çok muğlak ve / veya şaşırtma ihtimali vardır, çünkü ismine rağmen hem failbit hem de badbit'i kontrol eder. - Useless
@abhinav: çünkü (büyük ölçüde) özel bir kar tanesidir - bu (başarısız! demek için başarısız!) evrensel bir model değildir ve bu yüzden IMO azalır okunabilirlik. - Oliver Charlesworth


Ayrıca kullanabilirsiniz açık() çalışıp çalışmadığını kontrol etmek için, ama! izin verilir (sıfırı kontrol etmez, özeldir aşırı yük! )

Düzenle:
Sadece ilginin dışında - neden bu bir istisna oluşturmuyor?
Sadece istisnalar dışında bu akışlar tanıtıldı mı
ya da eski C ++ 'ya giriyoruz - bu sadece bir istisna olmak için istisnai olmayan bir hata.


9
2017-11-17 16:45



20 yıldan bu yana başarısız bir ifstream nesnesinin varlığına duyulan ihtiyacın ne olduğunu merak ediyorum… Potansiyel olarak, bir başka 20 yıl içinde bu problem çözülebilir (başka bir kurucunun ek bir please_throw () argümanı ile girilmesiyle). Umarım bu zamana kadar, hatanın nedeni istisna nesnede yer alacaktır. - Frank Puck


Belirli bir akışın, eof / fail / bad’in herhangi birisini istisna atmasını sağlayabilirsiniz. ios :: istisnalar () uygun bit maskesi ile çalışın. Yani, yukarıdaki ilk sorudaki örneği şöyle yazabilirsiniz:

std::ifstream stream;
stream.exceptions(std::ios::failbit | std::ios::badbit);
stream.open(filename.c_str());

Burada, streambit veya badbit ayarlandığında akış akışı bir istisna atar. Örneğin eğer lfStream :: open () Başarısızlık ayarlamak ve bir istisna atmak başarısız olur. Elbette, bu bitlerden herhangi biri akışta ayarlanmışsa, bu bir istisna atar, dolayısıyla bu yeniden yazma ilk örnekle tam olarak aynı değildir. Arayabilirsin

stream.exceptions(std::ios::goodbit);

Akıştaki tüm istisnaları iptal etmek ve hataları denetlemeye geri dönmek için.


8
2018-01-23 21:13





Meslektaşın yanlış. Belki de C yazmamayı unutmuş.

Kod açık. Onun kesinlikle Akış durumunu nasıl kontrol etmelisiniz.


3
2018-04-03 18:37