C++ 使用#include指令打印文件内容(预处理器)

C++ 使用#include指令打印文件内容(预处理器),c++,include,c-preprocessor,C++,Include,C Preprocessor,假设我有一个文件t.txt,其中包含以下两行: one two 现在,我想写一个程序,它将以某种方式包含该文件并打印其内容,仅此而已。也就是说,我希望该文件的内容在编译时以静态文本的形式出现在我的代码中 有什么想法吗 我问的原因是: 我想通过包含我自己的文件来创建quine(使用ifndefs,以防止在前两个文件之后递归包含):。所以我还是很想得到一个答案。你想要这份工作吗 示例.c static const char *var = #include "staticstring.t

假设我有一个文件t.txt,其中包含以下两行:

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);