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

  • B4ROK

    B4ROK

    1 EKİM 2008
  • natescamp

    natescamp

    30 NİSAN 2009
  • Rickymon Tero

    Rickymon Ter

    1 Ocak 2007