আমার একই রকম সমস্যা ছিল এবং ছোট ফাইলগুলির জন্য জোহানেস স্কাউবের পূর্বোক্ত সমাধানটি আমার জন্য কবজির মতো কাজ করেছিল।
তবে যে ফাইলগুলি কিছুটা বড় it অতএব, আমি একটি ছোট এনকোডার অ্যাপ্লিকেশন লিখেছি যা ফাইল সামগ্রীতে সমান আকারের অংশগুলির 2D অক্ষরের অ্যারে রূপান্তর করে (এবং সম্ভবত প্যাডিং জিরো)। এটি 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 পরিবর্তনশীল। ফলাফল হিসাবে চিহ্নিত সি কোড সহ ফাইলটি, উদাহরণস্বরূপ "main_js_file_data.h" এর পরে সহজেই সি ++ অ্যাপ্লিকেশনটির মধ্যে অন্তর্ভুক্ত করা যেতে পারে, উদাহরণস্বরূপ:
#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;
}