为什么std :: setw和std :: hex不适合下面的代码?

时间:2017-07-01 15:21:10

标签: c++

我看到某人的代码片段如下所示:
改变之前:

  void pal::type3_message::debug_print(std::ostream & out) const
     {
       out << "### type3_message:" << '\n'
           << pal::as_hex_dump(as_bytes())
           << "lm_response = " << pal::as_hex_string(lm_response_)
           << "\nnt_response = " << pal::as_hex_string(nt_response_)
           << "\ndomain = " << domain_
           << "\nuser = "   << user_
           << "\nworkstation = " << workstation_
           << "\nsession_key = " << pal::as_hex_string(session_key_)
           << std::hex << std::setw(8) << std::setfill('0')
           <<"\nssp_flags = " << ssp_flags_;
     }

更改后:

std::string pal::type3_message::debug_print() const
{
   std::ostringstream buf;
   buf << "### type3_message:" << '\n'
       << pal::as_hex_dump(as_bytes())
       << "lm_response = " << pal::as_hex_string(lm_response_)
       << "\nnt_response = " << pal::as_hex_string(nt_response_)
       << "\ndomain = " << domain_
       << "\nuser = "   << user_
       << "\nworkstation = " << workstation_
       << "\nsession_key = " << pal::as_hex_string(session_key_)
       << std::hex << std::setw(8) << std::setfill('0')
       <<"\nssp_flags = " << ssp_flags_;
    return buf.str();
}

我不太清楚上面的变化,有人能告诉我应该怎么做以及它的深刻意义吗?期待回应并欣赏它。

2 个答案:

答案 0 :(得分:1)

我不确定你在问什么,所以我只是解释代码示例的作用以及两个函数之间的主要区别:

void pal::type3_message::debug_print(std::ostream & out) const

此函数将消息写入out参数引用的输出流。它没有回报价值。

std::string pal::type3_message::debug_print() const

此函数似乎输出相同的消息,但不是将其写入流,而是将消息存储在字符串中。该字符串由函数返回。

两个函数的实现看起来非常相似,因为第二个函数在内部使用临时std::ostringstream。这是仅在内存中存在的流。相反,您可以将std::ofstream之类的文件流传递给第一个函数。

如果您想了解更多信息,请澄清您的问题。

答案 1 :(得分:0)

  

可以告诉我应该怎么做以及它的深层意义?

第一种方法接收std :: ostream&amp;参数,并将10多个不同的文本块流入其中。

第二种方法将相同的10个文本块流式传输到本地创建的(自动var)std :: ostringstream。这会在返回字符串之前连接块。

可能的用法示例(在std :: cout上实现相同的输出):

pal::type3_message::debug_print(std::cout);
std::cout << std::endl; 

std::cout << pal::type3_message::debug_print() << std::endl;

我更喜欢std :: stringstream方法,但我已经使用了它们。

在第一种方法中,线程可以被中断&#39;在更多的地方(10个之间)可能会影响非私人流的努力。这会导致问题吗?我没有在桌面上进行调查。

第二种方法完成连接,然后返回一个字符串。之前的所有中断点仍然存在,但没有一个会影响到共享流目标std :: cout的传递。请注意,此路径中仍有1个(或可能是2个)中断位置(附加字符串)。不过,这可能不太可能产生明显的问题。

在我曾经使用过的嵌入式系统中,由于它有驱动程序,第二种方法明显更好(在使用过程中线程中断方面)并且似乎在外出通道上不需要互斥保护。

在Ubuntu上,我添加了mutex guard来访问std :: cout ...以避免混合使用&#39;文字,虽然我没有确认这篇文章所描述的改变是否足够。

我有一个带有循环缓冲区的in-ram-log,并且该共享资源有一个互斥锁。多线程从不会导致同一日志出现任何问题。

注意:根据帖子问题,我发现在std :: hex或std :: setw方面的流量工作没有区别,两者的使用方式相同。

每年7月2日更新,评论

我同意&#39;之后&#39;是我喜欢的。

我不认识这句话&#34;不要搞乱借来的东西&#34;。我查看并决定谷歌关于这句话的报告没有软件相关性。

但它让我想起了我听过的一个可能相关的警告,&#34;代码就像一个洋葱&#34;。那个向我重复这个的人(痴迷地)拒绝修复&#39;事情(例如崩溃),因为,我猜测,他担心任何改变可能会破坏行为&#39;以无法察觉的方式。因此,他研究了所有洋葱层&#39;直到他确定在发生代码更改之前不会发生任何不好的事情。 &#39;通过分析瘫痪&#39;浮现在脑海中。

显然,我对尝试其他东西(以及测试,测试,测试......)更加宽容。崩溃很容易解决,崩溃肯定在理解洋葱的更深层次方面取得了进展。