2

私は C++ でサーバー アプリケーションを実行しており、HTTP 要求への応答として HTML ページを提供します。

問題は、現在、私の Web ページがコード内の定数文字列として記述されており、文字列自体の書き込み中に、<<演算子とを使用して他の文字列を挿入していることです。std::stringstreamより明確にするために例を参照してください。

std::string first("foo");
std::string second("bar");
std::string third("foobar");

std::stringstream ss;
ss << "<html>\n"
    "<head>\n"
    "<title>Bitches Brew</title>\n"
    "</head>\n"
    "<body>\n"
    "First string: "
    << first << "\n"
    "Second string: "
    << second << "\n"
    "Third string: "
    << third << "\n"
    "</body>\n"
    "</html>";

HTML構造と混合されたデータは実行中に変更されるため、コンテンツをファイルに単純に詰め込むことはできませんが、起こります。firstつまり、 、second、およびの文字列値を使用してページ全体をファイルに単純に書き込むことはできませんthird。これらの値は動的に変化するからです。

最初のリクエストでは を使用してページを送信しますがfirst = "foo";、2 番目のリクエストではを送信しますfirst = "anything else"

sscanf/sprintfまた、 fromに戻ってstdio.h必要なテキストを挿入することもできます。文字列のギャップを適切な形式 ( ) に置き換え、%sファイルから HTML 構造を読み取り、必要なものを挿入するだけです。

Cライブラリ関数なしでC++でこれを行いたいのですが、これを行うために何を使用すればよいかわかりませんでした。これに対するC++ の標準的な解決策は何でしょうか?

4

4 に答える 4

4

(s)printf標準 C++ には、それ自体以外に -like フォーマットに直接相当するものはありません(s)printf。ただし、Python の C++ 実装と safeを含むcppformatライブラリなど、この機能を提供する書式設定ライブラリは多数あります。str.formatprintf

とはいえ、代わりにテンプレート エンジンを使用することをお勧めします 。 C++ HTML テンプレート フレームワーク、テンプレート化ライブラリ、HTML ジェネレータ ライブラリを参照してください。

または、ファイルを読み取り、いくつかのプレースホルダーを引数に置き換えることで、いつでも車輪を再発明し、独自のテンプレート エンジンを作成することができます。

于 2013-01-02T17:17:22.183 に答える
1

他の答えが(正しく)示唆しているようにフレームワークを使用したくない場合は、この小さなプログラムからインスピレーションを得ることができると思います。

#include <iostream>
#include <map>

using namespace std;

string instantiate_html(string const& templateHTML, map<string, string> const& replacements)
{
    string outputHTML = templateHTML;
    for (auto& entry : replacements)
    {
        string placeholder = "<$" + entry.first + "$>";
        size_t it = outputHTML.find(placeholder);
        if (it != string::npos)
        {
            outputHTML.replace(it, placeholder.size(), entry.second);
        }
    }

    return outputHTML;
}

int main()
{
    map<string, string> replacements;
    replacements["name"] = "Mark";
    replacements["surname"] = "Brown";

    // Normally you would read this string from your template file
    string templateHTML = "<html><body><$name$><$surname$></body></html>";

    string outputHTML = instantiate_html(templateHTML, replacements);

    cout << outputHTML;

    return 0;
}
于 2013-01-02T17:38:36.963 に答える