2016-07-11 25 views
-2
#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; 
} 

In meinem Code, kommt Backslash in der Datei ausgegeben, aber es ist in der Ausgabe von hartcodiert Variablenwert in der program.I Uhr abwesend nicht sicher, wenn ich etwas verpasse.Abwesenheit von Backslash in dem fest codierten variablen Ausgang, aber in Dateiausgabe


Der Inhalt der Datei Data.doc ist das gleiche wie in der Variablen strPgm, Katze Data.doc,

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

Aber ich bin immer die Ausgabe als,

String aus Programm:

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

Zeichenfolge aus der Datei ist:

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

Warum ist das so? Beide sind gleiche Saiten. Aus diesem Grund tritt beim Konvertieren von strFile in jsonFormat und beim Parsen dieses Problems ein Problem auf.

Antwort

2

Es ist der Compiler, der Escapes und umgekehrte Schrägstriche in konstanten Stringliteralen behandelt. Also, wenn Sie eine Zeichenfolge wie "Hello\nWorld" in Ihrem Quellcode haben, ist es der Compiler, der \n in einen Zeilenumbruch konvertiert. Wenn Sie eine Datei mit umgekehrten Schrägstrichen haben, werden diese nicht verarbeitet, sondern unverändert gelesen.

2

Sie haben verstanden, was diese Zeile tut:

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

Es wird keine neue Zeichenfolge, die Schrägstriche in ihm hat. Die Backslashes sind für Escape die doppelte Anführungszeichen, so dass die gesamte Zeile als Teil der Zeichenfolge zu speichern, statt auf der c gestoppt wird.

Wenn Sie wirklich tatsächliche Schrägstriche in einem Stringliteral schreiben möchten, müssen Sie sie so schreiben müssen:

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

dh zunächst die umgekehrten Schrägstrich mit einem Escape es ein tatsächliches Backslash machen (lol):

\\ 

und dann die ausgetretenen doppelten Anführungszeichen:

\" 

Obwohl es scheint wirklich unwahrscheinlich, dass Sie maskiertes JSON speichern möchten.

+0

Ich weiß, was die strPgm tut.Aber ich habe nicht verstanden, warum die Ausgaben sind unterschiedlich, wenn die gleiche Zeichenfolge in einer Datei gespeichert ist.Ich möchte nicht Backslashes.In der Tat schreiben, ist meine Anforderung, dass beim Kopieren oder Speichern der Inhalte der Datei in eine Variable, und dann drucken, sollte es keine umgekehrten Schrägstriche enthalten.Während ich hart Codierung bin, wird Backslash Escaped.But während ich aus der Datei lesen, ist die gleiche Sache nicht passiert. – BusyTraveller

+0

Die Datei enthält bereits den umgekehrten Schrägstrich, da die Datei die Ausgabe eines Python-Programms enthält. Und ich finde keine Möglichkeit, den JSON ohne Backslash in eine Datei zu speichern. – BusyTraveller

+0

@Busy: Ich verstehe deine Sorge nicht. Ich habe erklärt, was Ihre C++ - Zeichenfolge ist. Sie haben gesagt, dass Ihre Datei etwas anderes enthält. Nun, deshalb sind sie anders. Fragen Sie _really_ wirklich, wie Sie eine Zeichenkette aus einer Datei lesen können?Weil deine Frage das nicht sagt! Ich habe Ihnen auch gezeigt, wie Sie eine C++ - Zeichenkette mit Literalbackslashes erzeugen, falls Sie das wollen. –