C++ 使用#include指令打印文件内容(预处理器)
假设我有一个文件t.txt,其中包含以下两行:C++ 使用#include指令打印文件内容(预处理器),c++,include,c-preprocessor,C++,Include,C Preprocessor,假设我有一个文件t.txt,其中包含以下两行: one two 现在,我想写一个程序,它将以某种方式包含该文件并打印其内容,仅此而已。也就是说,我希望该文件的内容在编译时以静态文本的形式出现在我的代码中 有什么想法吗 我问的原因是: 我想通过包含我自己的文件来创建quine(使用ifndefs,以防止在前两个文件之后递归包含):。所以我还是很想得到一个答案。你想要这份工作吗 示例.c static const char *var = #include "staticstring.t
one
two
现在,我想写一个程序,它将以某种方式包含该文件并打印其内容,仅此而已。也就是说,我希望该文件的内容在编译时以静态文本的形式出现在我的代码中
有什么想法吗
我问的原因是:
我想通过包含我自己的文件来创建quine(使用
ifndefs
,以防止在前两个文件之后递归包含):。所以我还是很想得到一个答案。你想要这份工作吗
示例.c
static const char *var =
#include "staticstring.txt"
;
int main() {
printf( "%s\n" var );
return 0;
}
staticstring.txt
"Some string that gets included at compile time"
我相信有一种方法可以让你不用在文本文件中加引号,但现在你什么都不想了。你喜欢这种方法吗 示例.c
static const char *var =
#include "staticstring.txt"
;
int main() {
printf( "%s\n" var );
return 0;
}
staticstring.txt
"Some string that gets included at compile time"
我相信有一种方法可以让你不用在文本文件中加引号,但现在什么都不想了。替代解决方案(因为最初的解决方案没有限制,正如在评论中提到的):作为构建过程的一部分,使用脚本(perl或python很容易做到)要从staticstring.txt
生成staticstring.h
,请根据需要添加引号和\n
,然后使用其他解决方案。这样,您的原始文件不会更改
你想改变吗
Text file with text
on multiple
lines
到
我认为纯粹使用预处理器是不可能的。替代解决方案(因为原始解决方案不会像注释中提到的那样没有限制地工作):作为构建过程的一部分,使用脚本(perl或python可以很容易地做到)从staticstring.txt
生成staticstring.h
,根据需要添加引号和\n
,然后使用其他解决方案。这样,您的原始文件不会更改
你想改变吗
Text file with text
on multiple
lines
到
我认为纯粹使用预处理器是不可能的。这是Microsoft教程: 它不是解释如何以编程方式或通过预处理器嵌入文件,而是通过VisualStudio2005+菜单。并解释如何从资源部门读回它
Delphi通过预处理器实现的,我不知道C++。但我知道可以手动编辑资源并将其包括在内,就像VS一样。这是Microsoft教程: 它不是解释如何以编程方式或通过预处理器嵌入文件,而是通过VisualStudio2005+菜单。并解释如何从资源部门读回它 Delphi通过预处理器实现的,我不知道C++。但是我知道可以手动编辑资源并将其包括在内,就像VS一样。
xxd-I
请参见此处:xxd-i
请参见此处:您可以在makefile中执行此操作:
all: target
TEXT_FILES = $(wildcard *.txt)
TEXT_OBJS = $(patsubst %.txt,%.text.o,$(TEXT_FILES))
target: main.o $(TEXT_OBJS)
$(CXX) -o app $^
%.text.cpp: %.txt
@echo "Building Text Source $*"
@echo "char const* $* =" > $@
@awk '{print "\"" $$0 "\\n\"";}' $^ >> $@
@echo ";" >> $@
这是干什么的。如果您有一个名为plop.txt的文本文件。然后,它使用变量“char const*plop=”创建一个文件plop.text.cpp。编译后,临时文件将被删除,但如果更改plop.txt文件,它将自动神奇地重建为plop.text.o 然后将所有这些结合在一起: 以下是我测试的示例:
> cat main.cpp
#include <iostream>
extern char* text;
int main()
{
std::cout << text;
}
> cat text.txt
Hi there this is a file
with multiple lines
we want to print out.
> make
g++ -c -o main.o main.cpp
Building Text Source text
g++ -c -o text.text.o text.text.cpp
g++ -o app main.o text.text.o
rm text.text.cpp
> ./app
Hi there this is a file
with multiple lines
we want to print out.
>
>cat main.cpp
#包括
外部字符*文本;
int main()
{
std::cout cat text.txt
嗨,这是一个文件
多行
我们想打印出来。
>制造
g++-c-o main.o main.cpp
构建文本源文本
g++-c-o text.text.o text.text.cpp
g++-o应用程序main.o text.text.o
rm text.text.cpp
>/应用
嗨,这是一个文件
多行
我们想打印出来。
>
您可以在makefile中执行此操作:
all: target
TEXT_FILES = $(wildcard *.txt)
TEXT_OBJS = $(patsubst %.txt,%.text.o,$(TEXT_FILES))
target: main.o $(TEXT_OBJS)
$(CXX) -o app $^
%.text.cpp: %.txt
@echo "Building Text Source $*"
@echo "char const* $* =" > $@
@awk '{print "\"" $$0 "\\n\"";}' $^ >> $@
@echo ";" >> $@
这是干什么的。如果您有一个名为plop.txt的文本文件,那么它将创建一个带有变量“char const*plop=”的文件plop.text.cpp。编译后,临时文件将被删除,但如果更改plop.txt文件,它将自动神奇地重建为plop.text.o 然后将所有这些结合在一起: 以下是我测试的示例:
> cat main.cpp
#include <iostream>
extern char* text;
int main()
{
std::cout << text;
}
> cat text.txt
Hi there this is a file
with multiple lines
we want to print out.
> make
g++ -c -o main.o main.cpp
Building Text Source text
g++ -c -o text.text.o text.text.cpp
g++ -o app main.o text.text.o
rm text.text.cpp
> ./app
Hi there this is a file
with multiple lines
we want to print out.
>
>cat main.cpp
#包括
外部字符*文本;
int main()
{
std::cout cat text.txt
嗨,这是一个文件
多行
我们想打印出来。
>制造
g++-c-o main.o main.cpp
构建文本源文本
g++-c-o text.text.o text.text.cpp
g++-o应用程序main.o text.text.o
rm text.text.cpp
>/应用
嗨,这是一个文件
多行
我们想打印出来。
>
我所做的是:
COPYING.cc: ${top_srcdir}/COPYING
echo "const char * COPYING = " >$@ || (rm $@;exit 1)
sed -e 's/"/\\"/g' -e 's/^/\"/' -e 's/$$/\\n\"/' $< >>$@ || (rm $@;exit 1)
echo ';' >>$@ || (rm $@;exit 1)
COPYING.cc:${top\u srcdir}/COPYING
echo“const char*COPYING=“>$@| |”(rm$@;退出1)
sed-e's/“/\\”/g'-e's/^/\“/'-e's/$$$/\\n\“/'$<>$$@| |(rm$@;退出1)
回显“;”>$@| |(rm$@;退出1)
在我的.中,我将其称为extern const char*COPYING
,但也可以#包括它。我所做的是:
COPYING.cc: ${top_srcdir}/COPYING
echo "const char * COPYING = " >$@ || (rm $@;exit 1)
sed -e 's/"/\\"/g' -e 's/^/\"/' -e 's/$$/\\n\"/' $< >>$@ || (rm $@;exit 1)
echo ';' >>$@ || (rm $@;exit 1)
COPYING.cc:${top\u srcdir}/COPYING
echo“const char*COPYING=“>$@| |”(rm$@;退出1)
sed-e's/“/\\”/g'-e's/^/\“/'-e's/$$$/\\n\“/'$<>$$@| |(rm$@;退出1)
回显“;”>$@| |(rm$@;退出1)
在我的.中,我将其称为extern const char*COPYING
,但也可以#包含它。您可以使用objcopy从源文件创建一个对象文件,并将其与实际的对象文件链接。它创建符号\u binary\u objfile\u start、\u binary\u objfile\u end和\u binary\u objfile\u size
,这三个符号您可以以字符数组的形式访问。您可以使用objcopy从源文件创建一个对象文件,并将其与实际的对象文件链接。它创建符号\u binary\u objfile\u start、\u binary\u objfile\u end和_binary\u objfile\u size
,您可以以字符数组的形式访问这些符号。据我所知,最短的C中的ine是:
main(){char*a="main(){char*a=%c%s%c;printf(a,34,a,34);}";printf(a,34,a,34);}
注意,这个
$ gcc t.c
$ ./a.out
#define FOO(f) do { \
FILE * ff = fopen(f, "rb"); \
char foo[255] = {0}; \
while (fgets (foo, 255, ff)) { \
printf ("%s", foo); \
}\
fclose(ff); \
} while (0)
int main () {
FOO("t.t");
return 0;
}
#include <stdio.h>
// include the file somehow
#define one
#define two
#include "t.txt"
int main(int argc, char* argv[])
{
// and print the contents of the file
const char* static_text = "one\ntwo\n";
printf(static_text);
// nothing more ;-)
return 0;
}
IDR_FILE_DIRECTORYINFO_H CPPCODE "DirectoryInfo.h"
IDR_FILE_DIRECTORYINFO_CPP CPPCODE "DirectoryInfo.cpp"
#define IDR_FILE_DIRECTORYINFO_H 312
#define IDR_FILE_DIRECTORYINFO_CPP 313
HRSRC hRes = FindResource(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_FILE_DIRECTORYINFO_CPP), _T("CPPCODE"));
DWORD dwSize = SizeofResource(GetModuleHandle(NULL), hRes);
HGLOBAL hGlob = LoadResource(GetModuleHandle(NULL), hRes);
const char* pData = reinterpret_cast<const char*>(::LockResource(hGlob));
MessageBoxA((HWND)0, pData, "This project source code:", MB_OK);