2013-01-15 19 views
8

olası Kopyaları (foobar.eof()!):
Why is iostream::eof inside a loop condition considered wrong?
eof() bad practice?neden (filanca >> x) göre tercih

Öğretmenim biz kullanmamalısınız sözü Metin dosyasında veya ikili dosya bilgilerini okumak için EOF yerine (afile >> x) kullanmalıyız. Nedenini açıklamadı, biri bana açıklayabilir. Birisi de ondan okumaya çalışmadan önce dosya sonunda olmadığından

//Assuming declaration 
//ifstream foobar 



(! foobar.eof()) 
{ 
    foobar>>x; // This is discouraged by my teacher 

} 


while (foobar>>x) 
{ 
    //This is encouraged by my teacher 

} 
+0

[this] (http://stackoverflow.com/questions/6512173/ifstream-not-reading-eof-character) ve diğerleri de. – Rapptz

cevap

13

okuma bu iki farklı yöntemde farkların ne açıklayabilir.

operator>>, okuma teşebbüs ve başarılı veya başarısız olmuştur sonra olduğu halde akışı için bir başvuru döndürür ve başarısız olursa o ya da false başarılı olursa akım true değerlendirir. eof() için test yapılması, dosyanın içinde yararlı bir veri bulunamayacağı, ancak henüz EOF'ta bulunamayacağı, daha sonra okuduğunuzda EOF'ta olduğu ve okunmanın başarısız olduğu anlamına gelir.

Başka bir önemli ayrıntı, akışlar için operator>>'un boşluk bırakmadığı, tüm önde gelen boşlukları atlamasıdır. Bu yüzden bir dosya okunmadan önce EOF'ta olamaz ve bir okumadan sonra EOF'ta olabilir. Ayrıca, dosyadaki sonraki veriler tamsayı olarak okunamayan veriler olduğunda (örneğin, bir sonraki veri x) yalnızca EOF'ta değil, çok önemli olduğunda da çalışır.

Örnek: sonradan

int x, y; 

f >> x; 

if (!f.eof()) 
    f >> y; 

f varsayarsak ilk okuma başarılı olur 123␣ (␣ demektir boşluk) verileri içeren bir dosya, ancak dosya:

kod göz İçinde daha fazla tamsayı yok ve EOF'ta değil var. İkinci okuma başarısız olur ve dosya EOF'ta olur, ancak bilmeden önce okumaya çalıştığınız için EOF için test ettiniz. Daha sonra kodunuz tanımsız davranışa neden olur, çünkü y başlatılmamış olur.

+0

Ne demek istiyorsun? – Computernerd

+1

@Computernerd örneğimi gör. –

+0

Açıklamanızı seviyorum. Doğru ve anlaşılması kolay. – paddy

İlgili konular