2008-09-16 9 views
17

मुझे एक सी ++ प्रोग्राम मिला है जो SQLite का उपयोग करता है। मैं SQL क्वेरी को एक अलग फ़ाइल में संग्रहीत करना चाहता हूं - एक सादा-पाठ फ़ाइल, कोई स्रोत कोड फ़ाइल नहीं - लेकिन उस फ़ाइल को निष्पादन योग्य फ़ाइल में संसाधन की तरह एम्बेड करें।सी ++ प्रोग्राम में डेटा एम्बेड करें

(यह लिनक्स पर चलने के लिए नहीं है, इसलिए मैं इसे एक वास्तविक संसाधन के रूप में के रूप में तक मुझे पता है की दुकान नहीं कर सकते हैं, कि हालांकि सही हो सकता है अगर यह विंडोज के लिए थे।)

कोई आसान तरीका है ऐसा करने के लिए, या क्या इसे प्रभावी रूप से मुझे लिनक्स के लिए अपना संसाधन सिस्टम लिखने की आवश्यकता होगी? (आसानी से संभव है, लेकिन इसमें बहुत अधिक समय लगेगा।)

उत्तर

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 

आप पर बाद में एक ही फाइल से उस फ़ाइल पर अन्य प्रसंस्करण के सभी प्रकार के कर सकता है, तो आप सरणी और उनमें से एक हैश नक्शा करना चाहते हैं कहते हैं, आप क्यू को फिर से परिभाषित कर सकता है एक और करने के लिए नौकरी और इसके साथ किया जाना चाहिए।

1

यह थोड़ा बदसूरत है, लेकिन आप हमेशा की तरह कुछ का उपयोग कर सकते हैं:

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

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

query_foo.txt उद्धृत क्वेरी पाठ कहाँ होते हैं।

+1

यदि इसमें कोई नई लाइन है तो क्या होगा? –

+0

यह एक नई लाइन के लिए काम नहीं करेगा। – SmallChess

3

आप अपनी टेक्स्ट फ़ाइल को हेडर फ़ाइल में कनवर्ट करने के लिए हमेशा एक छोटा प्रोग्राम या स्क्रिप्ट लिख सकते हैं और इसे अपनी बिल्ड प्रक्रिया के हिस्से के रूप में चला सकते हैं।

0

मैंने संसाधन फ़ाइल को एक सी स्रोत फ़ाइल में परिवर्तित करके इसे देखा है जिसमें केवल एक चार सरणी है जिसमें हेक्साडेसिमल प्रारूप में संसाधन फ़ाइल की सामग्री शामिल है (दुर्भावनापूर्ण वर्णों के साथ समस्याओं से बचने के लिए)। यह स्वचालित रूप से जेनरेट की गई स्रोत फ़ाइल को तब संकलित और प्रोजेक्ट से लिंक किया जाता है।

संसाधनों तक पहुंचने के लिए कुछ मुखौटा कार्यों को लिखने के लिए प्रत्येक संसाधन फ़ाइल के लिए कनवर्ट करने के लिए कनवर्टर को कार्यान्वित करना बहुत आसान होना चाहिए।

2

यहां एक नमूना है जिसे हमने फ़ाइलों के क्रॉस-प्लेटफ़ॉर्म एम्बेड करने के लिए उपयोग किया था। यह बहुत सरल है, लेकिन शायद आपके लिए काम करेगा।

आपको यह भी बदलने की आवश्यकता हो सकती है कि यह कैसे भागने में लाइनफ़ीड्स को संभालने में सक्षम है।

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