Frage

Ich habe ein C ++ Programm bekommt das SQLite verwendet. Ich mag die SQL-Abfragen in einer separaten Datei speichern - eine einfache Textdatei, nicht eine Quellcodedatei - aber einbetten dieser Datei in der ausführbaren Datei wie eine Ressource

.

(Dies hat unter Linux laufen zu lassen, also kann ich es nicht als eine tatsächliche Ressource speichern, soweit ich weiß, aber das wäre perfekt, wenn es für Windows ist.)

Gibt es eine einfache Möglichkeit, es zu tun, oder wird es erfordert mich effektiv mein eigenes Ressourcensystem für Linux zu schreiben? (Leicht möglich, aber es würde viel länger dauern.)

War es hilfreich?

Lösung

Sie können mit objcopy den Inhalt der Datei in ein Symbol binden Ihr Programm verwenden kann. Siehe zum Beispiel hier weitere Informationen.

Andere Tipps

Sie können immer ein kleines Programm oder Skript schreiben, um Ihre Textdatei in eine Header-Datei zu konvertieren und es als Teil des Build-Prozesses ausgeführt werden.

Verwenden von Makros. Technisch wäre die Datei Quellcode sein Datei, aber es würde nicht aussehen wie diese. Beispiel:

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

Später Sie von der gleichen Datei, die alle möglichen anderen Verarbeitung auf dieser Datei tun könnte, sagen Sie Array und eine Hash-Matrix von ihnen haben wollen würde, könnte man Q neu definieren einen anderen Job zu tun und mit ihm getan werden.

Hier ist ein Beispiel, das wir für die plattformübergreifende embeddeding von Dateien verwendet. Es ist ziemlich simpel, aber für Sie wahrscheinlich funktionieren.

Sie können sich auch ändern müssen, wie es Zeilenvorschübe in der escapeLine Funktion der Verarbeitung.

#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 ist etwas hässlich, aber man kann immer so etwas wie verwenden:

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

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

Wo query_foo.txt würde den zitierte Abfragetext enthalten.

ich das gesehen habe durch die Umwandlung der Ressource-Datei in eine C-Quelldatei mit nur einem char-Array durchgeführt werden, um den Inhalt der Ressource-Datei in einem hexadezimalen Format definiert, die (zur Vermeidung von Problemen mit schädlichem Zeichen). Diese automatisch generierte Quelldatei wird dann einfach zusammengestellt und mit dem Projekt verknüpft.

Es sollte ziemlich einfach sein, den Wandler zu implementieren C-Datei für jede Ressource-Datei Dump auch einige Fassadenfunktionen für den Zugriff auf die Ressourcen zu schreiben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top