Benzer sorunlarım vardı ve küçük dosyalar için yukarıda bahsedilen Johannes Schaub çözümü benim için bir cazibe merkezi oldu.
Ancak, biraz daha büyük dosyalar için, derleyicinin karakter dizisi sınırıyla ilgili sorunlarla karşılaştı. Bu nedenle, dosya içeriğini eşit büyüklükte parçalardan oluşan (ve muhtemelen sıfırları dolduran) bir 2D karakter dizisine dönüştüren küçük bir kodlayıcı uygulaması yazdım. Aşağıdaki gibi 2D dizi verileriyle çıktı tekstil dosyaları üretir:
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'}};
burada 4 aslında kodlayıcıda bir MAX_CHARS_PER_ARRAY değişkendir. Örneğin "main_js_file_data.h" olarak adlandırılan, sonuçta elde edilen C kodunu içeren dosya daha sonra kolayca C ++ uygulamasına satır içi olarak yerleştirilebilir, örneğin şu şekilde:
#include "main_js_file_data.h"
Kodlayıcının kaynak kodu:
#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;
}