【问题标题】:C++ streams question (explanation of comment in code)C++ 流问题(代码中注释的解释)
【发布时间】:2011-06-24 12:12:12
【问题描述】:

我正在使用 here 找到的 fastCGI 应用程序。

代码中有如下注释:

    if (content) delete []content;

    // If the output streambufs had non-zero bufsizes and
    // were constructed outside of the accept loop (i.e.
    // their destructor won't be called here), they would
    // have to be flushed here.

我对 C++ 流的了解相当薄弱。有人可以解释一下:

  1. 评论中提到了哪些流缓冲区?
  2. 在什么情况下流缓冲区的缓冲区大小不为零?

最后但并非最不重要的一点是,有人可以指出在线资源(双关语),它提供了对 C++ IO 流的清晰而温和的介绍?

【问题讨论】:

标签: c++ stream iostream


【解决方案1】:

评论中提到了哪些流缓冲区?

它指的是request.out,它是重新分配的cout的一部分:

FCGX_Request request;
...
    fcgi_streambuf cout_fcgi_streambuf(request.out);
    ...
    cout = &cout_fcgi_streambuf;

这个重新分配意味着用户可以调用

cout << "Content-type: text/html\r\n"
     << ...

并在作为 CGI 应用程序运行时在控制台(用于测试)或通过网络显示文本。因此,一个代码示例可以在多个环境中运行。


在什么情况下流缓冲区的缓冲区大小不为零?

您提到的评论是一个友好的提醒。此示例代码中的fcgi_streambuf 对象是在循环中构造的;当循环结束时,它们会超出范围并因此被破坏。

评论警告说,在许多情况下,用户必须刷新输出流:

cout.flush ();

【讨论】:

  • 这是cout 的VC5 版本吗?在标准 C++ 中,您可以通过调用 std::cout.rdbuf(&amp;newstreambuf); 来重定向 cout
  • @Ben 我从链接文件中排除了很多示例代码,但是有一个带有HAVE_IOSTREAM_WITHASSIGN_STREAMBUF 的条件编译,它使用了你正在谈论的结构。
猜你喜欢
  • 1970-01-01
  • 2019-05-23
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 2018-05-16
相关资源
最近更新 更多