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. eofbit
Bir mantıksal için bir dönüşüm bir rol oynar ( stream::operator bool
(veya operator void*
daha eski c ++)). Sadece badbit
ve failbit
dahil.
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 if
testlerle 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\n
veya sadece 0 42
bitmesiyle ç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_value
ile ç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 eofbit
ve hem failbit
de 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 eofbit
giriş 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 eofbit
ayarlanmış 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.