2013-10-09 3 views
1

У меня проблема с этим, что затрудняет мне время. Таким образом, я должен прочитать что-то в формате [Пожалуйста, прочитайте тело, а также, чтобы понять мой вопрос немного лучше]:getline (cin, input) с несколькими строками? (C++)

   TITLE 

The text is actually from a file being redirected 
to input stream via piping in linux bash. I cannot 
use ifstream or anything other than some form of cin, 
of which I believe getline to be the most useful. 

etc. 

В частности, то, что дает мне трудное время это пустое пространство между TITLE и тело. Кажется, я не думаю о том, как обойти это, используя getline (cin, string).

Лучшее, что я придумал:

while(inputString.size() != 0) 
    getline(cin,inputString); 
    //process string 

... выбрасывается из окна с упомянутой выше пустой строке.

Любые идеи, ребята?

Спасибо!

ответ

3

Я думаю, что реальная проблема здесь логика , Ваш ввод содержит как пустые, так и непустые строки, поэтому, если вы хотите их прочитать, вы не должны полагаться на длину строки. Это может быть сделано путем тестирования потока, возвращаемый std::getline, например, так:

while (getline(cin, inputString)) 
{ 
    // Do something with inputString... 
} 

петля читает cin построчно и останавливается, когда он достигает конец входного сигнала.

+0

Да! Это вызвало обаяние. Однако вы можете дать мне краткое объяснение, почему он все это читает? –

+2

@assignment_operator 'std :: getline' не только изменяет очищаемый объект потока, но и возвращает его. Как уже упоминалось [здесь] (http://stackoverflow.com/a/11063495/1336150), объект потока может быть проверен на достоверность, наведя его на указатель 'void *' (или явный 'bool', поскольку C++ 11). Вы получите нулевое значение ('false'), если есть ошибка чтения, * например * больше данных в потоке. –

+1

Ahhh, хорошо, это имеет гораздо больше смысла. Спасибо, я ценю ваше время и помощь. –

0

Должно быть

while(inputString.size() == 0) 

Вы носите на чтение в то время как строка имеет размер 0.

Для дополнительной ясности попробовать это вместо

while(inputString.empty()) 
+0

Прошу прощения за размер(), отсутствующие скобки были опечатками в моем OP. Я пробовал это, но он определяет пустую строку между TITLE и телом как 0 и выдает из цикла. Спасибо, тем не менее! Я попробую пустую() через минуту. –

+0

@assignment_operator К сожалению, я изначально пропустил основную ошибку в вашем коде, которая заключалась в том, что вы использовали '! =' Not '==', пожалуйста, просмотрите отредактированный ответ. – john

+0

, к сожалению, код выходит из первой строки, так как TITLE! = Размер 0. Еще раз спасибо! –

Смежные вопросы