我正在使用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;
但是什么是正确的方法?
答案 0 :(得分:3)
请记住,输入操作符>>
停止在空格处读取。
使用例如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);
答案 1 :(得分:2)
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;
答案 2 :(得分:1)
试试这个:
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
答案 3 :(得分:0)
我很惊讶setw(-1)
实际上对你有用,因为我没有看到这个记录,当我在VC10上尝试你的代码时,我只为sLeftovers
得到了“And”。我可能会使用std::getline( ss, sLeftovers )
作为字符串的其余部分,这在VC10中对我有效。