2008-09-16 14 views
17

SQLiteを使用するC++プログラムがあります。 SQLクエリを別のファイル、つまりではなくのソースコードファイルに保存したいが、そのファイルをリソースのような実行可能ファイルに埋め込む。C++プログラムにデータを埋め込む

(これは、Linux上で実行する必要があり、それはWindows用のであればそれは完璧になるけれども、私は、私の知る限り実際のリソースとしてそれを格納することはできません。)

任意の簡単な方法はありますそうするためには、Linux用の独自のリソースシステムを作成する必要がありますか? (簡単に可能ですが、時間がかかります)

答えて

24

あなたはあなたのプログラムが使用できるシンボルにファイルの内容をバインドするためにobjcopyを使用することができます。詳細については、たとえばhereを参照してください。

+0

美しい!ありがとうございました! –

3

マクロを使用します。技術的にはそのファイルはソースコードですが、このようには見えません。 例:あなたの後

//queries.incl - SQL queries 
Q(SELECT * FROM Users) 
Q(INSERT [a] INTO Accounts) 


//source.cpp 
#define Q(query) #query, 
char * queries[] = { 
#include "queries.incl" 
}; 
#undef Q 

同じファイルで、そのファイル上の他の処理のすべてのソートを行うことができますが、あなたが配列し、それらのハッシュマップを持ちたいと思い、あなたが別の操作を行うためにQを再定義することができ言います仕事とそれで完了します。

1

それは少し醜いですが、あなたはいつものようなものを使用することができます

query_foo.txtが引用されたクエリテキストが含まれます
const char *query_foo = 
#include "query_foo.txt" 

const char *query_bar = 
#include "query_bar.txt" 

を。

+1

何それは新しい行が含まれている場合は? –

+0

新しい行には機能しません。 – SmallChess

3

あなたは常にヘッダファイルにテキストファイルを変換するための小さなプログラムやスクリプトを記述し、ビルドプロセスの一環として、それを実行することができます。

0

Iは一のchar配列は、(悪意のある文字の問題を回避するために)16進形式のリソースファイルの内容を含む定義とCソース・ファイルにリソースファイルを変換することによって行われるために、これを見てきました。この自動的に生成されたソースファイルは、コンパイルされ、プロジェクトにリンクされます。

リソースにアクセスするためのいくつかのファサード関数を記述すると、各リソースファイルのためのCファイルをダンプするコンバータを実装するのはかなり簡単なはずです。

2

ここでは、ファイルのクロスプラットフォーム埋め込みに使用したサンプルを示します。 かなりシンプルですが、おそらくあなたのために働くでしょう。

また、それがescapeLine機能に改行を取り扱うだ方法を変更する必要があるかもしれません。

#include <string> 
#include <iostream> 
#include <fstream> 
#include <cstdio> 

using namespace std; 

std::string escapeLine(std::string orig) 
{ 
    string retme; 
    for (unsigned int i=0; i<orig.size(); i++) 
    { 
     switch (orig[i]) 
     { 
     case '\\': 
      retme += "\\\\"; 
      break; 
     case '"': 
      retme += "\\\""; 
      break; 
     case '\n': // Strip out the final linefeed. 
      break; 
     default: 
      retme += orig[i]; 
     } 
    } 
    retme += "\\n"; // Add an escaped linefeed to the escaped string. 
    return retme; 
} 

int main(int argc, char ** argv) 
{ 
    string filenamein, filenameout; 

    if (argc > 1) 
     filenamein = argv[ 1 ]; 
    else 
    { 
     // Not enough arguments 
     fprintf(stderr, "Usage: %s <file to convert.mel> [ <output file name.mel> ]\n", argv[0]); 
     exit(-1); 
    } 

    if (argc > 2) 
     filenameout = argv[ 2 ]; 
    else 
    { 
     string new_ending = "_mel.h"; 
     filenameout = filenamein; 
     std::string::size_type pos; 
     pos = filenameout.find(".mel"); 
     if (pos == std::string::npos) 
      filenameout += new_ending; 
     else 
      filenameout.replace(pos, new_ending.size(), new_ending); 
    } 

    printf("Converting \"%s\" to \"%s\"\n", filenamein.c_str(), filenameout.c_str()); 

    ifstream filein(filenamein.c_str(), ios::in); 
    ofstream fileout(filenameout.c_str(), ios::out); 

    if (!filein.good()) 
    { 
     fprintf(stderr, "Unable to open input file %s\n", filenamein.c_str()); 
     exit(-2); 
    } 
    if (!fileout.good()) 
    { 
     fprintf(stderr, "Unable to open output file %s\n", filenameout.c_str()); 
     exit(-3); 
    } 

    // Write the file. 
    fileout << "tempstr = "; 

    while(filein.good()) 
    { 
     string buff; 
     if (getline(filein, buff)) 
     { 
      fileout << "\"" << escapeLine(buff) << "\"" << endl; 
     } 
    } 

    fileout << ";" << endl; 

    filein.close(); 
    fileout.close(); 

    return 0; 
} 
関連する問題