SORU
22 AĞUSTOS 2008, Cuma


Metinden EOF son satırı tekrarlar kadar dosya okuma

AşağıdakiCbir kod kullanırifstreamokumak için nesne çarpmadan bir metin dosyasından bir satır başına sayı olan () tamsayılarEOF. Neden son satırda tamsayı iki kez okunuyor mu? Bunu nasıl düzeltebilirim?

Kod:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ifstream iFile("input.txt");	// input.txt has integers, one per line

    while (!iFile.eof())
    {
    	int x;
    	iFile >> x;
    	cerr << x << endl;
    }

    return 0;
}

input.txt:

10  
20  
30

Çıktı:

10  
20  
30  
30

Not: Hata denetleme kodu kodu küçük. parçacığı tutmak için kaçırdım Yukarıdaki davranış Windows (Visual C ), özellik listesi (gcc) ve Linux (gcc) görülür.

CEVAP
22 AĞUSTOS 2008, Cuma


Yakından olaylar zinciri sadece izleyin.

  • Al 10
  • Tut 20
  • Al 30
  • EOF al

Bu ikinci ve son yineleme bak. 30, sonra EOF kontrol etmek için devam aldın. EOF işareti henüz okuma olmadı çünkü EOF varmamış ("binarically" konuşma, kavramsal konumu sadece 30 satırdan sonra). Bu nedenle bir sonraki yineleme için taşıyorsunuz. x hala önceki yineleme 30. Şimdi akışından okuma ve EOF olsun. x ve ios kalır 30::eofbit ortaya çıkar. Çıkışı x stderr sadece önceki tekrarında 30,). Bir sonraki döngü bu durumda EOF kontrol edin, bu sefer cahil kalmışsın.

Bunu deneyin:

while (true) {
    int x;
    iFile >> x;
    if( iFile.eof() ) break;
    cerr << x << endl;
}

Bu arada, kodunuzda bir hata var. Hiç boş bir dosya üzerinde çalıştırmak için denediniz mi? Olsun davranışları da aynı nedenden ötürü.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 99being99

    99being99

    2 EYLÜL 2008
  • jesiel santos

    jesiel santo

    15 Ocak 2009
  • WK

    WK

    9 Ocak 2006