boost::format
использует %
для разделения спецификаций формата ; поэтому символы %
в вашем CSS приводят в замешательство; он пытается оценить их как спецификации формата. Вам нужно будет заменить их на %%
, чтобы получить на выходе буквальный %
символ.
Если это не поможет, то я бы порекомендовал попробовать отредактировать ваш шаблон на более мелкие кусочки, пока вы не найдете как можно меньший кусочек, который демонстрирует проблему. Как только вы это сделаете, вы можете обнаружить проблему самостоятельно, но если нет, отредактируйте свое сообщение, включив в него меньший фрагмент кода, который все еще демонстрирует проблему (предпочтительно 1 или 2 строки длиной менее 80 символов в каждой), а также точную ошибку, которая ты получаешь от Boost. Аналогично, было бы полезно, если бы вы опубликовали фрагмент кода, который вы используете для чтения в файле, и вызвали boost::format
; полная программа с несколькими строками кода для чтения шаблона и вывода вывода boost::format
позволила бы нам увидеть, есть ли в вашем коде что-то, что может вызывать проблемы (и опять же, это может помочь вам изолировать проблема сама).
Код, который вы опубликовали (немного отредактировал, чтобы он действительно работал; вы пропустили объявления buffer
и err
), прекрасно работает с отправленным вами шаблоном, если все знаки %
в 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;
}
А вот отредактированный шаблон:
<!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/>
<img src="Images/MyLogoReflected.png" alt="logo image"/>
<br />
<img src="Images/PDC_StatusPage.png" alt="remote status page image" />
<br />
<img src="Images/PDC_RemoteConfiguration.png" alt="remote config image" />
<br />
%s
<br />
<img src="Images/PDC_RemoteSubsystemStatus.png" alt="remote status image" />
<br />
%s
<br />
<img src="Images/PDC_RemoteConnectivityStatus.png" alt="remote status image" />
<br />
%s
<br />
</div>
</body>
</html>