stringstream 的意义何在?
它是一种灵活且快速的流,可作为其他(相对)慢速流的模拟器。我将 stringstream 用于许多不同的事情。
我最喜欢的用途是测试。我创建了一个 std::istream 并用测试数据填充它。这使我可以使用与我编码相同的编辑器创建测试数据“文件”(并且没有实际文件污染我的工作目录)。添加更多测试用例的耗时明显减少。
// 012345678901234567890123456789012345678901234567890
std::istringstream iss("7 ((23, 342), (17, 234), (335, 159), (10, 10))");
// ---|^^^^^^^|^v|vvvvvvv|v^|^^^^^^^^|^v|vvvvvv|^
// 1 2 3 4
// echo to user of test
std::cout << "Test Data Input: " << iss.str() << std::endl ;
// code under test starts here ...
int nTowns = 1;
char lparen0 = 2;
iss >> nTowns // NOTE : formatted input drops whitespace
>> lparen0;
// and continues with echo of post conversion
std::cout << " 0: " << nTowns << ' ' << lparen0 << std::endl;
// then more of the same - until record is completely read.
我已经使用 stringstream 来构建屏幕更新,并使用该动态变化的字符串来“测量”横幅宽度,并计算在屏幕上开始放置的位置,以便横幅居中(或左侧或右侧) :
static void centerUpdateScreenBanner( uint64_t gen,
int pdMS,
int changes,
TC_t& tc)
{
// build contents of screen banner update
std::stringstream ss;
ss << std::setw(3) << pdMS << " "
<< std::setw(4) << gen << " "
<< std::setw(4) << changes;
// compute start column placement for centering
int rCol = tc.maxCol -
static_cast<int>(ss.str().size()) +
tc.DfltIndnt-1;
// send banner to terminal device for user info
tc.termRef << Ansi_t::gotoRC(0, rCol) // top right
<< ss.str() << std::flush;
}
在这个链接列表中,我使用一个字符串流来吸收和递归连接列表节点信息。虽然这是递归构建的,但其他 cout 或 cerr 可以不受阻碍地继续进行 - 就像第三个通道一样。
std::string showR(void) {
std::stringstream ss;
ss << m_payload->show(); // this node
if(m_next) ss << m_next->showR(); // subsequent nodes
return (ss.str());
}
总结:我发现 std::stringstream 非常有用。