मेरे पास समान मुद्दे थे, और छोटी फाइलों के लिए जोहानस शाउब के उपरोक्त समाधान ने मेरे लिए एक आकर्षण की तरह काम किया।
हालाँकि, उन फ़ाइलों के लिए जो थोड़ी बड़ी हैं, यह संकलक की वर्ण सरणी सीमा के साथ मुद्दों में चली गई। इसलिए, मैंने एक छोटा सा एनकोडर एप्लिकेशन लिखा है जो फ़ाइल सामग्री को समान आकार के विखंडू के 2 डी चरित्र सरणी में परिवर्तित करता है (और संभवतः ज़ेडोस को पैड कर रहा है)। यह इस तरह से 2D सरणी डेटा के साथ आउटपुट टेक्स्टफाइल्स का उत्पादन करता है:
const char main_js_file_data[8][4]= {
{'\x69','\x73','\x20','\0'},
{'\x69','\x73','\x20','\0'},
{'\x61','\x20','\x74','\0'},
{'\x65','\x73','\x74','\0'},
{'\x20','\x66','\x6f','\0'},
{'\x72','\x20','\x79','\0'},
{'\x6f','\x75','\xd','\0'},
{'\xa','\0','\0','\0'}};
जहां 4 वास्तव में एनकोडर में एक चर MAX_CHARS_PER_ARRAY है। परिणामी C कोड वाली फ़ाइल, उदाहरण के लिए, "main_js_file_data.h", तब आसानी से C ++ एप्लिकेशन में इनलाइन की जा सकती है, उदाहरण के लिए:
#include "main_js_file_data.h"
यहाँ एनकोडर का स्रोत कोड है:
#include <fstream>
#include <iterator>
#include <vector>
#include <algorithm>
#define MAX_CHARS_PER_ARRAY 2048
int main(int argc, char * argv[])
{
// three parameters: input filename, output filename, variable name
if (argc < 4)
{
return 1;
}
// buffer data, packaged into chunks
std::vector<char> bufferedData;
// open input file, in binary mode
{
std::ifstream fStr(argv[1], std::ios::binary);
if (!fStr.is_open())
{
return 1;
}
bufferedData.assign(std::istreambuf_iterator<char>(fStr),
std::istreambuf_iterator<char>() );
}
// write output text file, containing a variable declaration,
// which will be a fixed-size two-dimensional plain array
{
std::ofstream fStr(argv[2]);
if (!fStr.is_open())
{
return 1;
}
const std::size_t numChunks = std::size_t(std::ceil(double(bufferedData.size()) / (MAX_CHARS_PER_ARRAY - 1)));
fStr << "const char " << argv[3] << "[" << numChunks << "]" <<
"[" << MAX_CHARS_PER_ARRAY << "]= {" << std::endl;
std::size_t count = 0;
fStr << std::hex;
while (count < bufferedData.size())
{
std::size_t n = 0;
fStr << "{";
for (; n < MAX_CHARS_PER_ARRAY - 1 && count < bufferedData.size(); ++n)
{
fStr << "'\\x" << int(unsigned char(bufferedData[count++])) << "',";
}
// fill missing part to reach fixed chunk size with zero entries
for (std::size_t j = 0; j < (MAX_CHARS_PER_ARRAY - 1) - n; ++j)
{
fStr << "'\\0',";
}
fStr << "'\\0'}";
if (count < bufferedData.size())
{
fStr << ",\n";
}
}
fStr << "};\n";
}
return 0;
}