ฉันมีปัญหาที่คล้ายกันและสำหรับไฟล์ขนาดเล็กวิธีแก้ปัญหาดังกล่าวของ Johannes Schaub ทำงานเหมือนมีเสน่ห์สำหรับฉัน
อย่างไรก็ตามสำหรับไฟล์ที่มีขนาดใหญ่ขึ้นเล็กน้อยจะพบปัญหากับการ จำกัด จำนวนอักขระของคอมไพเลอร์ ดังนั้นฉันจึงเขียนแอปพลิเคชั่นตัวเข้ารหัสขนาดเล็กที่แปลงเนื้อหาไฟล์เป็นอาเรย์อักขระสองมิติที่มีขนาดเท่ากัน (และอาจเป็นศูนย์เติมเต็ม) มันสร้าง textfiles เอาท์พุทที่มีข้อมูลอาร์เรย์ 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" สามารถถูก inline เข้าไปในแอปพลิเคชัน 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;
}