C/C++、可你#包括文件存入一个字符串?[重复]
-
12-09-2019 - |
题
这个问题已经有一个答案在这里:
- "#包括"一文本文件的C节目作为一个char[] 16的答案
我有一个C++源文件和Python源的文件。我想C++源文件能够使用的内容Python源文件作为大串的文字。我可以做这样的事情:
char* python_code = "
#include "script.py"
"
但是,这不会起作用,因为有需要\'s在每个月底线。我可以手动复制和粘贴在内的代码和环绕着每一个行报价和终止 ,但这是丑陋的.即使python源将有效地将可编入我的C++应用程序,我想保持它在一个单独的文件,因为它的更有组织和工作更好地与编辑(emacs不是足够的智慧认识到一个 C 串的文字代码和切换到蟒蛇模式,而你在里面)。
请不要建议我用PyRun_File,这就是我想要避免在第一位;)
解决方案
C/C++预处理器的行为单位的代币,并一字符串是一个 单 令牌。因此,你可以不干预中的一个字符串这样的。
你可以进行预处理script.py 到喜欢的东西:
"some code\n"
"some more code that will be appended\n"
并#包括,但是。或者您可以使用 xxd
-i
产生一个C静态阵列,准备列入。
其他提示
这不会得到你所有的方式出现,但它会让你漂亮的该死的接近。
假设 script.py
包含这样的:
print "The current CPU time in seconds is: ", time.clock()
第一,把它包起来是这样的:
STRINGIFY(print "The current CPU time in seconds is: ", time.clock())
然后,只是在你面前包括它,这样做:
#define STRINGIFY(x) #x
const char * script_py =
#include "script.py"
;
有可能是一个甚至更紧密的答案,但我仍然的搜索。
最好的方式做这样的事情是对包括该文件作为一个资源如果您的环境/工具有这种能力。
如果没有(如嵌入式系统等), 你可以使用一个bin2c实用工具(喜欢的东西 http://stud3.tuwien.ac.at/~e0025274/bin2c/bin2c.c).它将采取一个文件是二进制代表和吐出来C源文件,其中包括一系列的字节初始化这些数据。你可能需要做一些调整的工具或输出的文件如果你想阵列是'\0'终止。
纳入运行bin2c实用工具进入你的生成文件(或作为预先建立的步骤的任何你们用来驱动生成).然后只有该文件的汇编,并联系与应用程序和你有你的string(或任何其他图像的文件)坐在一块记忆代表阵列。
如果你们其中包括一个文本文件作为串,有一件事你应该知道的是,该线路的结局可能不匹配什么职能的期望-这可能是另一件事你要添加到bin2c用,或者你只想确保你的代码处理的任何行的结局都是在文件正确。也许修改bin2c实有一个'-s'换,表示希望文本文件incorportated作为一串这样的线路的结局,将标准化和零字节将在结束阵列。
你将不得不做一些你自己处理上的代码,以处理任何双报价,反斜杠,对三字符组,以及可能的其他事项外,出现。你可以在同一时间变换行进 (或反斜杠-逃跑),并增加双引号。结果将是一标题的文件产生Python源文件,然后你就可以#包括。用你的生成过程的自动化,这样,你仍然可以编辑Python源作为蟒蛇。
你可以用 嵌齿 为生成过程的一部分(要做的预处理和嵌入的代码)。我承认,这样的结果可能是不理想,因为然后你最后看到代码在这两个地方。但任何时候,我看到"Python,""C++",并"预处理"在closs邻,我觉得这值得一提。
这里是如何自动转换cmd.exe
------html2h.蝙蝠------
@echo off
echo const char * html_page = "\
sed "/.*/ s/$/ \\n\\/" ../src/page.html | sed s/\"/\\\x22/g
echo.
echo ";
它被称为喜欢
cmd /c "..\Debug\html2h.bat" > "..\debug\src\html.h"
和附代码
#include "../Debug/src/html.h"
printf("%s\n", html_page);
这是相当依赖于系统的办法,但是,正如大多数人,我不喜欢十六垃圾场。
使用 fopen
, getline
, , fclose
.