Как очистить ширину при выводе из потока после использования std::setw?

Я использую std::stringstream для анализа строки фиксированного формата в значения. Однако последнее значение для анализа не имеет фиксированной длины.

Чтобы разобрать такую ​​строку, я мог бы сделать:

std::stringstream ss("123ABCDEF1And then the rest of the string");
ss >> std::setw(3) >> nId
   >> std::setw(6) >> sLabel
   >> std::setw(1) >> bFlag
   >> sLeftovers;

Но как мне установить ширину так, чтобы выводилась оставшаяся часть строки?

Путем проб и ошибок я обнаружил, что это работает:

   >> std::setw(-1) >> sLeftovers;

Но каков правильный подход?


person DaBozUK    schedule 21.11.2012    source источник
comment
делая это работает: std::setw(-1) вы имеете в виду, что sLeftovers содержит значение «И» или «А затем остальная часть строки»? Я нахожу, что 'std::setw(-1)` извлекает только слово И, т.е. тот же результат, что и '›› sLeftovers' — это не влияет, что согласуется с документацией для std::setw, в которой говорится, что std::setw устанавливает количество символов, которые будут использоваться в качестве поля для следующей операции вставки.   -  person mark    schedule 21.11.2012
comment
Вы совершенно правы, Марк, в моем реальном коде не было места в данных.   -  person DaBozUK    schedule 21.11.2012


Ответы (4)


Помните, что оператор ввода >> прекращает чтение на пробеле.

Используйте, например. std::getline, чтобы получить оставшуюся часть строки:

std::stringstream ss("123ABCDEF1And then the rest of the string");
ss >> std::setw(3) >> nId
   >> std::setw(6) >> sLabel
   >> std::setw(1) >> bFlag;
std::getline(ss, sLeftovers);
person Some programmer dude    schedule 21.11.2012

std::setw влияет только на одну операцию, т. е. >> bFlag сбрасывает ее по умолчанию, поэтому вам не нужно ничего делать для ее сброса.

то есть ваш код должен просто работать

std::stringstream ss("123ABCDEF1And then the rest of the string");
ss >> std::setw(3) >> nId
   >> std::setw(6) >> sLabel
   >> std::setw(1) >> bFlag
   >> sLeftovers;
person Community    schedule 21.11.2012
comment
Это не так, sLeftovers в моем коде - это 1 символ A (из And...). Вы уверены, что std::setw влияет только на одну операцию? - person DaBozUK; 21.11.2012

Попробуй это:

std::stringstream ss("123ABCDEF1And then the rest of the string");
std::stringstream::streamsize initial = ss.width(); // backup
ss >> std::setw(3) >> nId
   >> std::setw(6) >> sLabel
   >> std::setw(1) >> bFlag
   >> sLeftovers;

ss.width(initial); // restore
person utnapistim    schedule 21.11.2012

Я удивлен, что setw(-1) действительно работает для вас, потому что я не видел этого в документации, и когда я попробовал ваш код на VC10, я получил только «И» для sLeftovers. Я бы, вероятно, использовал std::getline( ss, sLeftovers ) для оставшейся части строки, что сработало для меня в VC10.

person Ron Kluth    schedule 21.11.2012