#テキスト ファイルを C プログラムに char[] としてインクルード

これには (unix util)xxd を使用することをお勧めします。このように使用できます

$ echo hello world > a
$ xxd -i a

出力:

unsigned char a[] = {
  0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x0a
};
unsigned int a_len = 12;

質問は C に関するものでしたが、誰かが C++11 でそれを行おうとすると、新しい生の文字列リテラルのおかげで、含まれているテキスト ファイルを少し変更するだけで実行できます:

C++ では次のようにします:

const char *s =
#include "test.txt"
;

テキスト ファイルで次の操作を行います:

R"(Line 1
Line 2
Line 3
Line 4
Line 5
Line 6)"

したがって、ファイルの先頭に接頭辞、末尾に接尾辞のみが必要です。文字シーケンス )" を必要としない限り、特別なエスケープは必要ありません。 .ただし、独自のカスタム区切り文字を指定すると、これでも機能します。

R"=====(Line 1
Line 2
Line 3
Now you can use "( and )" in the text file, too.
Line 5
Line 6)====="

2 つの可能性があります:

<オール>
  • コンパイラ/リンカーの拡張機能を使用して、ファイルをバイナリ ファイルに変換し、適切なシンボルがバイナリ データの開始と終了を指すようにします。この回答を参照してください:GNU ld リンカー スクリプトを含むバイナリ ファイルを含めます。
  • 配列を初期化できる一連の文字定数にファイルを変換します。 "" を実行して複数行にまたがることはできないことに注意してください。行継続文字 (\ )、エスケープ " それを機能させるためのキャラクターやその他。バイトを '\xFF', '\xAB', ...., '\0' のようなシーケンスに変換する小さなプログラムを作成する方が簡単です (または UNIX ツール xxd を使用します) 利用可能な場合は、別の回答で説明されています!):
  • コード:

    #include <stdio.h>
    
    int main() {
        int c;
        while((c = fgetc(stdin)) != EOF) {
            printf("'\\x%X',", (unsigned)c);
        }
        printf("'\\0'"); // put terminating zero
    }
    

    (未検証)。次に、次のことを行います:

    char my_file[] = {
    #include "data.h"
    };
    

    data.h が生成される場所

    cat file.bin | ./bin2c > data.h