Встраивать данные в программу на C++

У меня есть программа на C++, использующая SQLite. Я хочу хранить SQL-запросы в отдельном файле - текстовом файле, нет - файле исходного кода, - но встраивать этот файл в исполняемый файл как ресурс.

(Это должно работать в Linux, поэтому я не могу сохранить его как реальный ресурс, насколько мне известно, хотя это было бы идеально, если бы это было для Windows.)

Есть ли какой-нибудь простой способ сделать это или мне потребуется написать собственную систему ресурсов для Linux? (Легко возможно, но это займет намного больше времени.)

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
17
0
7 829
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Используйте макросы. Технически этот файл будет файлом исходный код, но он не будет выглядеть так. Пример:

//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, чтобы выполнить другую работу, и покончить с этим.

Это немного некрасиво, но вы всегда можете использовать что-то вроде:

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

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

Где query_foo.txt будет содержать цитируемый текст запроса.

что, если он содержит новую строку?

Viktor Sehr 22.11.2010 16:23

Вы всегда можете написать небольшую программу или сценарий, чтобы преобразовать текстовый файл в файл заголовка и запустить его как часть процесса сборки.

Я видел, как это можно сделать, преобразовав файл ресурсов в исходный файл C с определенным только одним массивом символов, содержащим содержимое файла ресурсов в шестнадцатеричном формате (чтобы избежать проблем с вредоносными символами). Этот автоматически сгенерированный исходный файл затем просто компилируется и связывается с проектом.

Должно быть довольно легко реализовать преобразователь для дампа файла C для каждого файла ресурсов, а также написать некоторые функции фасада для доступа к ресурсам.

Ответ принят как подходящий

Вы можете использовать objcopy для привязки содержимого файла к символу, который может использовать ваша программа. См., Например, здесь для получения дополнительной информации.

Вот пример, который мы использовали для кроссплатформенного встраивания файлов. Это довольно упрощенно, но, вероятно, вам подойдет.

Вам также может потребоваться изменить способ обработки перевода строки в функции 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;
}

Другие вопросы по теме