2012-10-16 51 views
5
Örneğin

bir metin dosyası ayrıştırılırken, bazı zamanlar bu dosya şöyle şeyler var: 3th hat boş bir dize (hiçbir şey, boşluk) .. şeydir sahipStringstream >> string'in dizgeye hiçbir şey koymayacağı nasıl kontrol edilir?

keyword a string here 
keyword another string 
keyword 
keyword again a string 

Not olduğunu zaman sizi o stringstream >> laststring yapın ve stringstream boş bir dizgeye (boş veya sadece beyaz boşluk) sahip, "laststring" in üzerine yazmaz, hiçbir şey yapmaz. Bu durumu elden önce kontrol etmek için neyse? Sadece stringstream sonra hala boş olduğunu kontrol etmek için geçici boş bir dize oluşturmak istemiyorum >>, lame görünüyor.

cevap

15

Eğer akışından okuyamaz zaman - onun devlet değişiklikleri böylece dönecektir bool için yayın yaparken yanlış:

bool read = (ss >> laststring); 

ideone example

+0

ninja! Bu, sadece cevabı kabul etmek için 5 dakika bekliyorum. – Icebone1000

1

Yalnızca bir şey olup olmadığını okumaya çalışıyorum sonra bilebilir görün ya da değil. Bir sonraki konumda olmayan bir boşluk varsa Ne yapmak mümkün olabilir boşluk atlayıp görmektir:

if ((in >> std::ws).peek() != std::char_traits<char>::eof()) { 
    ... 
} 

boş dizeler yaratmak için ucuz olduğunu göz önüne alındığında, zahmet ve okumak deneyin olmaz dize. Bununla birlikte, akışlardan okunmanın satır temelli olmadığına dikkat edin; diğer bir deyişle, yukarıdaki durumda, satırların ilk bölümünü ayırmanız veya satırın ikinci bölümünü okumak için std::getline() gibi bir şey kullanmanız gerekir.

+0

Sorunun metninden, bence zaten bir "getline" var ve stringstream'den okuyor. aksi halde, okuma "boş bir dizgeye" sahip olmaz ve bir sonraki satıra giderdi. –

+0

@MooingDuck: Boş bir dize oluşturma konusunda endişeli olduğu için, ilk önce bir çizgiyi okumak garip geliyor ;-) Bu, soruyu tek bir satır okumayı okudum dedi. Aksi halde beyaz boşluk atlama da işe yaramazdı. –

0

Dosyadan bir satır okumak için getline'ı kullanabilirsiniz. Ardından, satırı bir dize akışına kopyalayın ve dize akışından her seferinde birer birer kelimeleri okuyun. Akışlar, satır/kelime bittiğinde otomatik olarak okumayı durduracaktır.

// open file 
std::ifstream fin("text.txt"); 

// 'iterate' through all the lines in the file 
unsigned lineCount = 1; 
std::string line; 
while (std::getline(fin, line)) 
{ 
    // print the line number for debugging 
    std::cout << "Line " << lineCount << '\n'; 

    // copy line into another stream 
    std::stringstream lineStream(line); 

    // 'iterate' through all the words in the line 
    unsigned wordCount = 1; 
    std::string word; 
    while (lineStream >> word) 
    { 
     // print the words for debugging 
     std::cout << '\t' << wordCount++ << ' ' << word << '\n'; 
    } 
} 

Sen iostream, fstream, sstream ve string dahil etmek gerekir.

+0

Neredeyse ne yapıyorum, ne bilmiyordum operasyonun bool olarak kontrol edilmesidir. – Icebone1000