2013-10-09 3 views
2

в следующей небольшой программе я хочу прочитать inputString с пробелами:C++ IStream - как читать строку с пробелами

#include <string> 
#include <sstream> 
#include <iostream> 


int main(int argc , char ** argv) { 
    std::string inputString(" ITEM "); 
    std::istringstream inputStream(inputString); 

    //Template: 

    T value; 

    inputStream.unsetf(std::ios::skipws); 
    inputStream >> value; 

    std::cout << "Value: [" << value << "]" << std::endl; 
    std::cout << "StringPos: " << inputStream.tellg() << std::endl; 
    std::cout << "State: " << inputStream.good() << std::endl; 
} 

Это производит вывод:

Value: [] 
StringPos: -1 
State: 0 

Если я удалить unsetf() я вместо этого получаю:

Value: [ITEM] 
StringPos: 4 
State: 1 

Т.е. как и ожидалось, когда пробелы игнорируются. Итак, очевидно, что я делаю что-то не так с настройкой «Не пропустить пробелы». Какие-нибудь советы?

Редактировать: добавив шаблон-значение «T value», пример больше не компилируется; но важно, чтобы

inputStream >> value; 

Работы. Следующий мета код должен работать, а также:

if is_string(T) 
    value = inputString; // String values are assigned directly 
else 
    inputStream >> value; // Other types. 

Йоаким

+0

я думаю, что вы ищете 'станд :: GetLine()' – Najzero

+0

Видимо извлекая 'string' из потока, когда «skipws» ошибочно ошибочно. – jrok

ответ

3

Использование:

std::string line; 
if(std::getline(inputStream, line)) { 
    // line contains one line from the input stream 
} else { 
    // inputStream is empty, EOF or in error state 
} 
+0

Спасибо, но; код, который я опубликовал, иллюстрирует проблему - но мне действительно нужно – user422005

+0

Не думайте, что это сработает. Код шаблонов - см. Обновление. – user422005

+0

@ user422005 - попробуйте 'inputStream.setf (std :: noskipws);' или 'inputStream >> std :: noskipws >> value; вместо этого (я не уверен в этом). – utnapistim

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