Как очистить ширину при выводе из потока, после использования 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;

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

Спасибо

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);

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;

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

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

Я удивлен, что setw(-1) actually works for you because I haven't seen this documented, and when I tried your code on VC10, I only got "And" for sLeftovers, Я бы наверное использовал std::getline( ss, sLeftovers ) for the remainder of the string, which worked for me in VC10.

Другие вопросы по тегам