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
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ü.
Okuma hat 2 dosya veya başlık satırı a...
Ne kadar düzenli bir dosya bash yoksa ...
Ne kadar etkili Vim birden fazla dosya...
Python: okuma diziye satır satır dosya...
Ne kadar Ulvi metinden Python kodunu ç...