硬编码变量输出中没有反斜杠,但存在于文件输出中

Absence of backslash in the hardcoded variable output , but present in file output

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main () 
{
string strFile = "";
ifstream myfile ("data.doc");

string strPgm  = "{ \"c\" : { \"p1\": \"v1\", \"p2\":\"v2\" } }";
cout << "\n string from program is : " << strPgm <<"\n"; 
if (myfile.is_open())
{
string line;
while ( getline (myfile,line) )
{
  strFile = strFile+line;
}
myfile.close();
cout <<"\n string from file is  : " << strFile <<"\n";
}

else cout << "Unable to open file"; 
return 0;
}

在我的代码中,反斜杠出现在文件输出中,但它在 program.I 中硬编码变量值的输出中不存在,我不确定,如果我遗漏了什么。


文件内容 data.doc 与变量 strPgm 中的内容相同, 猫 data.doc ,

"{ \"c\" : { \"p1\": \"v1\", \"p2\": \"v2\" } }"

但我得到的输出为,

来自程序的字符串是:

{ "c" : { "p1": "v1", "p2": "v2" } }

文件中的字符串是:

"{ \"c\" : { \"p1\": \"v1\", \"p2\": \"v2\" } }"

为什么会这样?两者都是相同的字符串。因此,在将 strFile 转换为 jsonFormat 并解析它时出现问题。

编译器 处理常量字符串文字中的转义和反斜杠。因此,如果您的源代码中有一个类似于 "Hello\nWorld" 的字符串,那么编译器会将 \n 转换为换行符。如果您有一个包含反斜杠的文件,这些文件不会被处理,而是按原样读取。

你误解了这行的意思:

string strPgm  = "{ \"c\" : { \"p1\": \"v1\", \"p2\":\"v2\" } }";

它不会创建其中包含反斜杠的字符串。反斜杠用于 转义 双引号,以便将整行视为要存储的字符串的一部分,而不是停在 c.

如果你真的想将实际的反斜杠写入字符串文字,你必须这样写:

string strPgm  = "{ \\"c\\" : { \\"p1\\": \\"v1\\", ...

即首先是反斜杠,通过转义使其成为真正的反斜杠(笑):

\

然后是转义双引号:

\"

尽管您似乎不太可能想要存储转义 JSON。