Ancak, C ++ programcıları her zaman olan şeyin son satır iki kez okunana kadar cin.eof () işlevinin "true" döndürmediğini belirtir.
Olan şey bu değil. eofbitBir mantıksal için bir dönüşüm bir rol oynar ( stream::operator bool(veya operator void*daha eski c ++)). Sadece badbitve failbitdahil.
Boşluk ile ayrılmış sayılar içeren bir dosya okuduğunuzu varsayalım. Etrafa dayalı bir döngü cin.eof()kaçınılmaz olarak yanlış veya iftestlerle dolu olacaktır . EOF'a kadar okumuyorsun. Sayıları okuyorsunuz. Kodunuzun şu mantığı ifade etmesini sağlayın:
while (stream >> some_var) {
process_value(some_var);
}
Bu, dosyanın son satırının bitip bitmemesiyle 0 42\nveya sadece 0 42bitmesiyle çalışır (dosyadaki son satırın sonunda yeni satır olmaz). Dosya ile biterse 0 42\n, son iyi okunan değer 42 değerini alır ve satır sonundaki işaretleyiciyi okur. EOF işaretçisinin henüz okunmadığını unutmayın. İşlev process_valueile çağrılır 42. Akış çıkarma operatörünün bir sonraki çağrısı >> EOF'u okur ve hiçbir şey çıkarılmadığından hem eofbitve hem failbitde ayarlanır.
Öte yandan, dosya ile bitiyor 0 42(son satırın sonunda yeni satır yok). Son iyi okuma EOF işaretinde sona eren 42 değerini alır. Muhtemelen bu 42 işlemek istiyorsunuz. Bu yüzden eofbitgiriş akışı boole dönüşüm operatörü bir rol oynamıyor. Akış çıkarma operatörünün >> bir sonraki çağrısında, altta yatan makine hızlı bir şekilde eofbitayarlanmış olduğunu görür . Bu, hızlı bir şekilde failbit.
İlk kod parçası neden her zaman düzgün çalışmıyor?
Çünkü döngü koşulu olarak EOF'u kontrol etmemelisiniz. Döngü koşulu, yapmaya çalıştığınız şeyi (örneğin, bir akıştan sayıları ayıklamak) ifade etmelidir.