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