boost :: format - 尝试使用HTML作为格式化字符串 - 需要一些帮助

时间:2009-11-17 20:50:03

标签: c++ boost format

我正在尝试使用boost :: format,其格式字符串是下面的HTML。我打算在%s占位符指定的位置插入3x std :: strings。

换句话说 - 我打开下面的* .html文件进行读取,将其内容读入单个std :: string并将其用作格式化程序。接下来我尝试执行以下操作:

std::string output = (boost::format(formatter) % str1 % str2 % str3).str();

str1-3是包含我试图插入的文本的字符串 - 显然。 格式尝试抛出一个异常,说格式字符串格式错误。我一直试图分析它在过去2小时的大部分时间,但我失败了,我需要一些帮助。

以下HTML有什么问题 - 为什么它不能成为正确的格式化字符串?我应该注意哪些限制?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>KP&D</title>
    <style type="text/css"> 
        html, body 
        {
            height: 100%;
            margin: 0;
            padding: 0;
        }
        img#bg 
        {
            position:fixed;
            top:0;
            left:0;
            width:100%;
            height:100%;
        }
        #content 
        {
            position:relative;
            z-index:1;
        }       
    </style>
</head>
<body>
<img src="Images/PageBackground.png" alt="background image" id="bg" />
<div id="content">
<br/>&nbsp;
<img src="Images/MyLogoReflected.png" alt="logo image"/>
<br />&nbsp;
<img src="Images/PDC_StatusPage.png" alt="remote status page image" />
<br />&nbsp;
<img src="Images/PDC_RemoteConfiguration.png" alt="remote config image" />
<br />&nbsp;
%s
<br />&nbsp;
<img src="Images/PDC_RemoteSubsystemStatus.png" alt="remote status image" />
<br />&nbsp;
%s
<br />&nbsp;
<img src="Images/PDC_RemoteConnectivityStatus.png" alt="remote status image" />
<br />&nbsp;
%s
<br />&nbsp;
</div>
</body>
</html>

以下是负责加载前述文件的代码段:

#include <string>
#include <fstream>
#include <boost/algorithm/string.hpp>
#include <boost/format.hpp>

int main()
{
    std::ifstream ifs("welcome.html"); // the html is in that file

    if(!ifs.good())
      return 1;

    std::string buffer = "";

    while(!ifs.eof())
    {
      char buf[256];
      ifs.getline(buf, 256);
      buffer += buf;
    }

    buffer = boost::trim_right_copy(buffer);

    const std::string str1 = "aaa";
    const std::string str2 = "bbb";
    const std::string str3 = "ccc";
    std::string Out = "";

    try{
    Out = (boost::format(buffer)
          % str1
          % str2
          % str3
          ).str();
   } catch(std::exception &e)
   { 
      err = e.what(); 
      return 1; 
   }

    return 0;
}

2 个答案:

答案 0 :(得分:4)

boost::format使用%来分隔format specifications;所以你的CSS中的%个字符令人困惑;它试图将它们作为格式规范进行评估。您需要使用%%替换那些,才能在输出中只获得文字%字符。

如果这没有帮助,那么我建议您尝试将模板编辑成较小的部分,直到找到一个尽可能小的模块来说明问题。一旦你这样做,你可能会自己发现问题,但如果没有,你可以编辑你的帖子以包含仍然显示问题的较小片段(最好是1或2行,每行少于80个字符),以及确切的错误你来自Boost。同样,如果您发布了用于在文件中读取的代码片段并调用boost::format,则会有所帮助。一个包含几行代码的完整程序,用于读取模板,并打印boost::format的输出,这样我们就可以看到代码中是否有任何可能导致问题的内容(同样,这可能会有所帮助)你自己隔离问题。)

您发布的代码(编辑了一下,因此它实际上有效;您遗漏了buffererr的声明),如果所有{{1}都适用于您发布的模板正如我最初建议的那样,CSS中的符号被%替换。这是编辑过的代码(包括检查它是否有效的输出):

%%

这是编辑过的模板:

#include <string>
#include <fstream>
#include <boost/algorithm/string.hpp>
#include <boost/format.hpp>
#include <iostream>

int main()
{
    std::ifstream ifs("template.html"); // the html is in that file
    std::string buffer, err;

    if(!ifs.good())
      return 1;

    while(!ifs.eof())
    {
      char buf[256];
      ifs.getline(buf, 256);
      buffer += buf;
    }

    buffer = boost::trim_right_copy(buffer);

    const std::string str1 = "aaa";
    const std::string str2 = "bbb";
    const std::string str3 = "ccc";
    std::string Out = "";

    try{
    Out = (boost::format(buffer)
          % str1
          % str2
          % str3
          ).str();
   } catch(std::exception &e)
   { 
      err = e.what(); 
      std::cout << err << std::endl;
      return 1;
   }

    std::cout << Out;

    return 0;
}

答案 1 :(得分:0)

我设法找到了问题。

优化文件读取后&amp;修复它工作正常的%字符。非常感谢你们。

这是我在如何将整个文件一次性读取到字符串时发现的一个很酷的片段:)

buffer = std::string((std::istreambuf_iterator<char>(ifs)),
                          std::istreambuf_iterator<char>());