使用std :: ends()和冻结(false)

时间:2013-02-06 15:24:11

标签: c++ stream std

我正在查看一些遗留代码,并且有相当多的stringstream用法。到目前为止,代码通常从各种类型生成消息。除了在某些情况下执行以下操作之外:

   std::ostringstream f1;
   f1 << sDirectory << mFileName << sFileExtension << '\0';

和其他人做(只是说明)

   std::ostringstream f1;
   f1 << sDirectory << mFileName << sFileExtension << std::ends;

我相信这些调用是因为它进一步访问f1.str().c_str()并且需要null来终止它。

这些电话有什么不同吗?我从http://en.cppreference.com/w/cpp/io/manip/ends看到std :: ends没有刷新,std :: end在不同的平台上是不同的(Linux / Windows / Mac)?我应该更喜欢一个吗?

除此之外,我读到在作用域后面的字符串流上应该调用freeze(false)(在使用str()之后)以允许释放缓冲区(http://en.cppreference.com/w/cpp/io/ostrstream/freeze) 。再次(可能是我误读或误解)但是没有调用freeze(false)所以这表明上面的每个流都在泄漏?

N.B。仅供参考这是Visual Studio 2005 / Windows 7,但我不知道是否有任何影响。

道歉,如果我是密集的......

1 个答案:

答案 0 :(得分:1)

std::ends被定义为具有以下效果:

  

在输出序列中插入一个空字符:调用os.put(charT())

charTchar时,值初始化为值0,等同于字符文字\0。因此,当charTchar时,它通常是两行代码完全相同。

但是,即使您的信息流的字符类型不是std::ends,使用char也能正常运作。