如何包含字符字面量?

8

我有一个关于从文件中获取信息时如何包含字符串字面值的问题。让我展示一下我的代码以便更好地理解:

Program.b:

print \"Hello World\n\"; print \"Commo Estas :)\n\"; print \"Bonjour\";print \"Something\"; return 0;

main.cpp(我已将实际文件最小化,只保留了此问题所需的内容):

int main()
{
    std::string file_contents;
    std::fstream file;
    file.open("Program.b");
    std::ifstream file_read;
    file_read.open("Program.b");

    if(file_read.is_open())
        while(getline(file_read,file_contents));

    cout << file_contents << endl;

}

所以现在当我打印file_contents时,我得到:

print \"Hello World\n\"; print \"Commo Estas :)\n\"; print \"Bonjour\";print \"Something\"; return 0;

您可以看到它包含了\n。有没有办法将其变成实际的字符文字,这样打印时就会打印出一个新行呢?(我也希望引号也能这样处理。)

1
你需要在运行时读取文件吗?否则,你可能可以利用预处理器。 - πάντα ῥεῖ
不,我不需要,@πάνταῥεῖ。你的意思是我可以利用预处理器吗?.. #define toStr(x) #x - amanuel2
@amanuel2 你可以稍微调整一下你的 Program.b,并使用 #include "Program.b" 语句来初始化一个 std::string 变量。 - πάντα ῥεῖ
@Rikocar .. 嗯,unescape(file_contents);,使用那个被接受的特定答案中的unescape函数不起作用。 - amanuel2
@Rikocar 噢,当我只打印返回语句 cout << unescape(file_contents) << endl; 时似乎可以工作。 - amanuel2
显示剩余2条评论
2个回答

6

试试像这样:

Program.b

R"inp(print "Hello World\n"; print "Commo Estas :)\n"; print "Bonjour";print "Something"; return 0;)inp"

main.cpp

int main() {
    std::string file contents = 
    #include "Program.b"
    ;
    std::cout << file_contents << std::endl;

}

您也可以更改 Program.b 使其更易读:

R"inp(
print "Hello World\n"; 
print "Commo Estas :)\n"; 
print "Bonjour";
print "Something"; 
return 0;
)inp"

运行时变量应该是:

Program.b

print "Hello World\n"; 
print "Commo Estas :)\n"; 
print "Bonjour";
print "Something"; 
return 0;

main.cpp

int main()
{
    std::string file_contents;
    std::fstream file;
    file.open("Program.b");
    std::ifstream file_read;
    file_read.open("Program.b");

    if(file_read.is_open()) {
        std::string line;
        while(getline(file_read,line)) {
             file_contents += line + `\n`;
        }
    }

    cout << file_contents << endl;

}

哇,那个还挺简陋的 :) - Rakete1111
@Rakete1111 嗯,限制了BoneLang的能力。因为我必须使用R。不过我有另一种方法,不需要使用R。谢谢,这将对读者有所帮助。 - amanuel2
由于我必须使用R,那么很不幸,你不能将它放在“Program.b”文件之外,因为“#include”无法在双引号内工作。我曾在这里提出类似的问题,请稍等片刻。 - πάντα ῥεῖ
@amanuel2 这是链接:https://dev59.com/jpffa4cB1Zd3GeqP_rTR - πάντα ῥεῖ
那似乎是一种“黑客式”的方法 :P。看看这个代码片段。下个时段见啦! - amanuel2
@amanuel2 根据查看您的gist,我扩展了我的答案。这似乎是那种情况下更合适的方式。 - πάντα ῥεῖ

2
你可以进行简单的查找和替换操作。
std::size_t pos = std::string::npos;
while ((pos = file_contents.find("\\n")) != std::string::npos)
    file_contents.replace(pos, 1, "\n");

//Every \n will have been replaced by actual newline character

哇,这似乎是个好主意,但当你需要更多时,这将有点繁琐。我应该发布我的解决方案吗? - amanuel2
@amanuel2 你可以始终编写一个通用函数,以删除任何特殊字符及其实际表示。 - Rakete1111
谢谢。请查看代码片段。我要去上下一节课了,拜拜! - amanuel2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接