C++ std::stringstream 运算符<< vs (构造函数)

C++ std::stringstream operator<< vs (constructor)

本文关键字:lt 构造函数 vs std 运算符 C++ stringstream      更新时间:2023-10-16

我的期望是我可以创建一个未初始化的std::stringstream并为其提供字符串,或者最初使用相同的流创建它并获得相同的结果。当我做第一个案例时,代码按预期工作。然后我尝试了第二种情况,期望会有同样的结果,但没有发生。我错过了什么?

第一个案例的片段。

...
int main() {
constexpr auto APTCP_XML_DOC_PREFIX            {R"EOD(<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE doc [<!ENTITY nbsp "&#xa0;">]>
<doc>
<head>
</head>
<body>
)EOD"};
   std::stringstream xml_doc; xml_doc << APTCP_XML_DOC_PREFIX;
...
   if (transformer.transform(xml_doc, style_sheet, std::cout) != 0)
      std::cerr << "aptcp/main()/transformer.getLastError(): " << transformer.getLastError() << "n" << style_sheet.str() << xml_doc.str();
   }

第二种情况xml_doc以这种方式初始化。

   std::stringstream xml_doc(APTCP_XML_DOC_PREFIX);

出现此错误:

Fatal Error: comment or processing instruction expected (Occurred in an unknown entity, at line 2, column 1.)
aptcp/main()/transformer.getLastError(): SAXParseException: comment or processing instruction expected (Occurred in an unknown entity, at line 2, column 1.)
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet id="aptcp_stylesheet"
                version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output
            method="html"
            version="4.01"
            indent="yes"
            doctype-system="http://www.w3.org/TR/html4/strict.dtd"
            doctype-public="-//W3C//DTD HTML 4.01//EN"/>
<xsl:template match="xsl:stylesheet" />
<xsl:param name="current_time_p"/>
<xsl:template match="/">
  <html>
  <body>
    <style>
    pp {display: none;}
    pp, table, tr {
        width: 100%;
...

此代码:

#include <iostream>
#include <sstream>
#include <string>
#include <utility>
#include <cstring>
int main() {
    constexpr auto BEFORE {"Before"};
    std::stringstream un; un << BEFORE;
    un << "UN";
    std::cout << "un=" << un.str() << "." << std::endl;
    std::stringstream con(BEFORE);
    con << "CON";
    std::cout << "con=" << con.str() << "." << std::endl;
    }

显示该值放置在前面而不是末尾。

un=BeforeUN.
con=CONore.

要回答这个问题,缺少模式(std::ios::ate"打开后立即搜索流的末尾"(:

std::stringstream xml_doc(APTCP_XML_DOC_PREFIX,
    std::ios::in|std::ios::out|std::ios::ate);