Domanda

Ho un programma in C++ che utilizza SQLite.Voglio memorizzare le query SQL in un file separato -- un normale file di testo, non un file di codice sorgente -- ma incorporare il file nel file eseguibile come una risorsa.

(Questo deve funzionare su Linux, quindi non posso conservarla come una vera e propria risorsa per quanto ne so, però, che sarebbe perfetto se non fosse per Windows).

C'è qualche modo semplice per farlo, o si effettivamente mi richiede di scrivere il mio di risorse di sistema per Linux?(Facilmente possibile, ma ci vorrà molto più tempo).

È stato utile?

Soluzione

È possibile utilizzare objcopy per associare il contenuto del file in un simbolo, il programma può utilizzare.Vedere, per esempio, qui per ulteriori informazioni.

Altri suggerimenti

Si può sempre scrivere un piccolo programma o uno script per convertire i file di testo in un file di intestazione ed eseguire come parte del processo di creazione.

Utilizzare le macro.Tecnicamente il file sarebbe il codice sorgente file ma non sarebbe simile a questa.Esempio:

//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

In seguito si potrebbe fare anche gli altri tipi di lavorazione su quel file con lo stesso file, dire che si vuole avere array e hash mappa di essi, si potrebbe ridefinire il Q fare un altro lavoro e il gioco è fatto.

Ecco un esempio che abbiamo usato per il cross-platform embeddeding di file.È abbastanza semplicistico, ma probabilmente funzionerà per voi.

Si può anche bisogno di cambiare come si gestisce caratteri di avanzamento riga in escapeLine funzione.

#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;
}

E 'un po' brutto, ma si può sempre usare qualcosa come:

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

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

Dove query_foo.txt dovrebbe contenere il citato testo della query.

Ho visto questo per essere fatto convertendo il file di risorse di un file di origine C con un solo array di char definito con il contenuto del file di risorse in formato esadecimale (per evitare problemi con il maligno caratteri).Questo generato automaticamente il file di origine è quindi semplicemente compilato e collegato al progetto.

Dovrebbe essere abbastanza facile da implementare il convertitore di dump file C per ogni file di risorse anche come scrivere un po ' di facciata funzioni per l'accesso alle risorse.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top