7

我正在使用 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

4 回答 4

3

请记住,输入运算符>>在空白处停止读取。

使用 egstd::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);
于 2012-11-21T15:29:15.687 回答
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;
于 2012-11-21T15:30:39.323 回答
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
于 2012-11-21T15:30:57.837 回答
0

我很惊讶它setw(-1)实际上对你有用,因为我还没有看到这个文档,当我在 VC10 上尝试你的代码时,我只得到了sLeftovers. 我可能会使用std::getline( ss, sLeftovers )字符串的其余部分,这在 VC10 中对我有用。

于 2012-11-21T16:16:30.103 回答