149 votes

"#inclure" un fichier texte dans un programme C comme un char[]

Existe-t-il un moyen d'inclure un fichier texte entier sous forme de chaîne dans un programme C au moment de la compilation ?

quelque chose comme :

  • file.txt :

    This is
    a little
    text file
  • main.c :

    #include <stdio.h>
    int main(void) {
       #blackmagicinclude("file.txt", content)
       /*
       equiv: char[] content = "This is\na little\ntext file";
       */
       printf("%s", content);
    }

obtenir un petit programme qui imprime sur stdout "Ceci est un petit fichier texte"

Pour le moment, j'ai utilisé un script pirate de python, mais c'est moche et limité à un seul nom de variable, pouvez-vous me dire une autre façon de le faire ?

8voto

John Zwinck Points 43636

Vous pouvez le faire en utilisant objcopy :

objcopy --input binary --output elf64-x86-64 myfile.txt myfile.o

Vous disposez maintenant d'un fichier objet que vous pouvez lier à votre exécutable et qui contient des symboles pour le début, la fin et la taille du contenu à partir de myfile.txt .

6voto

mattnewport Points 4809

Si vous êtes prêt à recourir à quelques astuces douteuses, vous pouvez faire preuve de créativité avec des chaînes de caractères brutes et des chaînes de caractères numériques. #include pour certains types de fichiers.

Par exemple, disons que je veux inclure quelques scripts SQL pour SQLite dans mon projet et je veux obtenir la coloration syntaxique mais je ne veux pas d'infrastructure de construction spéciale. Je peux avoir ce fichier test.sql qui est un SQL valide pour SQLite où -- commence un commentaire :

--x, R"(--
SELECT * from TestTable
WHERE field = 5
--)"

Et ensuite dans mon code C++ je peux avoir :

int main()
{
    auto x = 0;
    const char* mysql = (
#include "test.sql"
    );

    cout << mysql << endl;
}

La sortie est :

--
SELECT * from TestTable
WHERE field = 5
--

Ou pour inclure du code Python à partir d'un fichier test.py qui est un script Python valide (car # commence un commentaire en Python et pass est un non-opérationnel) :

#define pass R"(
pass
def myfunc():
    print("Some Python code")

myfunc()
#undef pass
#define pass )"
pass

Et ensuite dans le code C++ :

int main()
{
    const char* mypython = (
#include "test.py"
    );

    cout << mypython << endl;
}

Ce qui donnera :

pass
def myfunc():
    print("Some Python code")

myfunc()
#undef pass
#define pass

Il devrait être possible de jouer des tours similaires pour divers autres types de code que vous pourriez vouloir inclure dans une chaîne de caractères. Je ne sais pas si c'est une bonne idée ou non. C'est une sorte de piratage soigné, mais ce n'est probablement pas quelque chose que vous voudriez avoir dans un code de production réel. Cela pourrait être correct pour un projet de week-end.

2voto

Daniel A. White Points 91889

Regardez ici pour lire un fichier dans un char[].

http://stackoverflow.com/questions/410943/reading-a-text-file-into-an-array-in-c

Voici quelques conseils pour utiliser les macros du préprocesseur C.

http://gcc.gnu.org/onlinedocs/cpp/Macros.html

2voto

Vous avez besoin de mon xtr mais vous pouvez le faire avec un bash script . C'est un script que j'appelle bin2inc . Le premier paramètre est le nom du fichier résultant char[] variable . Le deuxième paramètre est le nom de la file . La sortie est C include file avec le contenu du fichier codé (en minuscules) hex ) comme le nom de la variable donnée. Le site char array es zero terminated et la longueur des données est stockée dans $variableName_length

#!/bin/bash

fileSize ()

{

    [ -e "$1" ]  && {

        set -- `ls -l "$1"`;

        echo $5;

    }

}

echo unsigned char $1'[] = {'
./xtr -fhex -p 0x -s ', ' < "$2";
echo '0x00'
echo '};';
echo '';
echo unsigned long int ${1}_length = $(fileSize "$2")';'

VOUS POUVEZ OBTENIR XTR ICI xtr (character eXTRapolator) est GPLV3

2voto

TechDragon Points 119

Pourquoi ne pas lier le texte au programme et l'utiliser comme variable globale ? Voici un exemple. J'envisage de l'utiliser pour inclure des fichiers de shaders Open GL dans un exécutable, car les shaders GL doivent être compilés pour le GPU au moment de l'exécution.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X