2012-10-16 10 views
5

Na przykład, podczas analizowania pliku tekstowego, kilka razy ten plik ma rzeczy tak:Jak sprawdzić, czy string string >> string nic nie wstawi w łańcuchu?

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

Należy zauważyć, że linia 3th mieć pusty ciąg (nic lub spacji) .. Chodzi o to, że kiedy do stringstream >> laststring, a stringstream ma pusty łańcuch (pusty lub tylko biały), nie zastąpi "laststringu", nie zrobi nic. W każdym razie, aby sprawdzić tę sytuację przed ręką? Nie chcę utworzyć pustego ciągu znaków tymczasowych, aby sprawdzić, czy jest nadal pusty po stringstream >>, wydaje się lame.

Odpowiedz

15

Gdy nie można odczytać ze strumienia - jego zmiany stanu więc podczas rzucania do bool zwróci false:

bool read = (ss >> laststring); 

Zobacz ideone example

+0

ninja! to jest to, czekam tylko 5 minut na zaakceptowanie odpowiedzi. – Icebone1000

1

Można tylko wiedzieć po próbuje odczytać, czy było coś albo nie. Co może być w stanie zrobić to, aby pominąć spacje i zobaczyć, czy jest tam zakaz przestrzeń w następnej lokalizacji:

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

Biorąc pod uwagę, że puste struny są tanie tworzenie, ja nie przeszkadzało i spróbować przeczytać strunowy. Zauważ jednak, że odczyt ze strumieni nie jest oparty na linii, tj. W twoim przypadku powyżej musisz najpierw podzielić linie lub użyć czegoś w rodzaju std::getline(), aby odczytać drugą część linii.

+0

Z treści pytania, myślę, że ma już 'getline' i czyta z stringstream. w przeciwnym razie czytanie nie będzie miało "pustego ciągu" i przejdzie do następnego wiersza. –

+0

@MooingDuck: Cóż, ponieważ martwi się on tworzeniem pustego łańcucha, wydaje się dziwne, aby najpierw przeczytać wiersz ;-) Powiedziałem, że przeczytałem to pytanie jako czytające pojedynczą linię. W przeciwnym razie pomijanie białych znaków również nie działa. –

0

Możesz użyć getline, aby odczytać wiersz z pliku. Następnie skopiuj linię do strumienia napisów i odczytywanie słów ze strumienia napisów po jednym na raz. Strumienie automatycznie zatrzymają czytanie, gdy zabraknie linii/słów.

// 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'; 
    } 
} 

Trzeba to iostream, fstream, sstream i string.

+0

prawie co robię, to, czego nie wiedziałem, to sprawdzenie działania jako bool. – Icebone1000

Powiązane problemy