2010-11-18 4 views
0

ini-Datei, die enthält: Adresse = „localhost“ username = „root“ password = „IhrKennwort“ Datenbank = „yourdatabasename“Wie lese ich ein Wort zwischen "" mit ifstream?

und ich brauche das Wort zwischen den beiden „“ mit ifstream zu finden, und lege es in einen char.

Gibt es eine Möglichkeit, dies zu tun?

+0

sind da newlines zwischen jedem Paar Schlüssel = Wert? – Simone

+0

ja es gibt Linien zwischen ihnen – Marcus

+0

Ich nehme an, du meinst 'char *', nicht 'char'.wenn dies für die Schnittstellenanforderungen ist, sind Sie fast sicher besser dran mit einem' std: : string'. –

Antwort

0

Wenn zwischen jedem Paar Zeilenumbrüche vorhanden sind, können Sie Folgendes tun.

std::string line; //string holding the result 
char charString[256]; // C-string 

while(getline(fs,line)){ //while there are lines, loop, fs is your ifstream 
    for(int i =0; i< line.length(); i++) { 
     if(line[i] != '"') continue; //seach until the first " is found 

     int index = 0; 
     for(int j= i+1; line[j] != '"'; j++) { 
      charString[index++] = line[j]; 
     } 
     charString[index] = '\0'; //c-string, must be null terminated 

     //do something with the result 
     std::cout << "Result : " << charString << std::endl; 

     break; // exit the for loop, next string 
    } 
} 
+0

Thx, aber ich bin mir nicht sicher, wie ich das programmieren soll. Kannst du mir helfen? – Marcus

0

Ich würde es Ansatz wie folgt:

  • eine Klasse erstellen, die den Name-Wert-Paar
  • Verwenden std::istream& operator>>(std::istream &, NameValuePair &);

Anschließend können Sie etwas tun, wie repräsentiert:

ifstream inifile(fileName); 
NameValuePair myPair; 
while(ifstream >> myPair) 
{ 
    myConfigMap.insert(myPair.asStdPair()); 
} 

Wenn Ihre Ini-Datei Abschnitte enthält, von denen jeder ein benanntes Wertpaar enthält, müssen Sie bis zum Ende des Abschnitts lesen, damit Ihre Logik keinen Stromausfall verwendet, sondern eine Art abstrakte Factory mit einem Zustandsautomaten verwendet. (Sie lesen etwas und bestimmen dann, was es ist, was Ihren Zustand bestimmt).

Um den Stream in Ihr Name-Wert-Paar einzulesen, könnte dies mit getline geschehen, wobei das Zitat als Terminator verwendet wird.

Beachten Sie, dass ich nicht in nvPair.name geschrieben habe, bis wir das Token vollständig analysiert haben. Wenn das Streaming fehlgeschlagen ist, möchten wir nicht teilweise schreiben.

Der Datenstrom wird in einem Fehlerzustand belassen, wenn die getline fehlschlägt. Dies geschieht natürlich am Ende der Datei. Wir möchten keine Ausnahme auslösen, wenn sie aus diesem Grund fehlschlägt, weil dies das falsche Ende des Dateiendes ist. Du könntest es werfen, wenn es zwischen dem Namen und dem Wert fehlschlägt, oder wenn der Name nicht das nachgestellte = Zeichen hat (aber nicht leer ist), weil das kein natürliches Vorkommen ist.

Beachten Sie, dass dies Leerzeichen und sogar Zeilenumbrüche zwischen den Anführungszeichen erlaubt. Was auch immer zwischen ihnen ist, wird anders als andere Zitate gelesen. Sie müssten eine Escape-Sequenz verwenden, um diese zuzulassen (und den Wert analysieren).

Wenn Sie \ verwendet“, wie die Escape-Sequenz dann, wenn Sie den Wert zu erhalten, müssen Sie‚Schleife‘, wenn es endet mit einem \ (sowie es zu einem Kurswechsel), und verketten sie zusammen.

Verwandte Themen