Tôi đã có những vấn đề tương tự, và đối với các tập tin nhỏ, giải pháp đã nói ở trên của Julian Schaub hoạt động như một cơ duyên đối với tôi.
Tuy nhiên, đối với các tệp lớn hơn một chút, nó gặp vấn đề với giới hạn mảng ký tự của trình biên dịch. Do đó, tôi đã viết một ứng dụng mã hóa nhỏ để chuyển đổi nội dung tệp thành một mảng ký tự 2D gồm các đoạn có kích thước bằng nhau (và có thể là các số 0 đệm). Nó tạo ra các tệp văn bản đầu ra với dữ liệu mảng 2D như thế này:
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'}};
trong đó 4 thực sự là một biến MAX_CHARS_PER_ARRAY trong bộ mã hóa. Tệp có mã C kết quả, được gọi, ví dụ "main_js_file_data.h" sau đó có thể dễ dàng được đưa vào ứng dụng C ++, ví dụ như sau:
#include "main_js_file_data.h"
Đây là mã nguồn của bộ mã hóa:
#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;
}