Pregunta

Tengo un programa de C++ que utiliza SQLite.Quiero guardar las consultas SQL en un archivo separado -- un archivo de texto sin formato, no un archivo de código fuente -- pero incrustar el archivo en el archivo ejecutable como un recurso.

(Esto tiene que ejecutar en Linux, así que no se puede almacenar como un recurso real que yo sepa, a pesar de que sería perfecto si no fuera por Windows).

¿Hay alguna manera sencilla de hacerlo, o que efectivamente me exige escribir mi propio sistema de recursos para Linux?(Fácilmente posible, pero tomaría mucho más tiempo.)

¿Fue útil?

Solución

Usted puede utilizar objcopy para enlazar el contenido del archivo en un símbolo de su programa puede usar.Véase, por ejemplo, aquí para obtener más información.

Otros consejos

Siempre puedes escribir un pequeño programa o script para convertir su archivo de texto en un archivo de encabezado y ejecutarlo como parte de su proceso de construcción.

El uso de macros.Técnicamente ese archivo sería código fuente archivo, pero no se parecen a esto.Ejemplo:

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

Más tarde usted puede hacer todo tipo de procesamiento en el que el archivo por el mismo archivo, digamos que usted quiere tener la matriz y un hash mapa de ellos, usted podría redefinir Q hacer otro trabajo y hacer con ella.

He aquí un ejemplo que hemos utilizado para la cruz-plataforma de embeddeding de archivos.Es bastante simplista, pero es probable que el trabajo para usted.

Usted también puede necesitar para cambiar cómo es el manejo de saltos de línea en el escapeLine función.

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

Es un poco feo, pero siempre puedes usar algo como:

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

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

Donde query_foo.txt contendría el citado texto de la consulta.

He visto que esto se realiza mediante la conversión de los recursos de archivo en un archivo de código fuente de C con sólo una matriz de char definido que contiene el contenido del archivo de recursos en un formato hexadecimal (para evitar problemas con malintencionado caracteres).Esta generado automáticamente el archivo de origen es simplemente compila y enlaza con el proyecto.

Debería ser bastante fácil de implementar el convertidor para el volcado de archivo C para cada archivo de recursos también como escribir algunas fachada de funciones para acceder a los recursos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top