2009-05-16 9 views
0

ich derzeit an einem Programm arbeite, das jede Zeile aus einer Datei lesen und extrahiert das Wort von der Linie spezifische Trennzeichen verwendet.Das letzte Wort nicht in Zeile lesen

Also im Grunde sieht mein Code wie diese

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int main(int argv, char **argc) 
{ 
    ifstream fin(argc[1]); 
    char delimiter[] = "|,.\n "; 
    string sentence; 

    while (getline(fin,sentence)) { 
    int pos; 
    pos = sentence.find_first_of(delimiter); 
    while (pos != string::npos) { 
     if (pos > 0) { 
      cout << sentence.substr(0,pos) << endl; 
     } 
      sentence =sentence.substr(pos+1); 
      pos = sentence.find_first_of(delimiter); 
     } 
    } 
} 

jedoch didnot meines Code das letzte Wort in der Zeile lesen. Zum Beispiel sieht meine Datei so aus. Hallo Welt

die Ausgabe aus dem Programm ist nur das Wort "Hallo", aber nicht "Welt". Ich habe '\ n' als Trennzeichen verwendet, aber warum hat es nicht funktioniert ?.

Jeder Hinweis würde geschätzt.

+0

Das klingt wie eine Klassenzuordnung. –

+0

Offensichtlich nicht der echte Code - wo ist die Definition von "Satz". –

+0

Ich habe das behoben, aber in Zukunft bitte Code schreiben, der wie beschrieben funktioniert. Was du ursprünglich gepostet hast, hat nicht einmal kompiliert. Es wird uns etwas Zeit sparen und Ihnen eine schnellere Antwort geben, wenn Sie Arbeitscode veröffentlichen, der den Fehler darstellt, von dem Sie sprechen. –

Antwort

2

getline speichert nicht die neuen Zeilen Zeichen in der Zeichenfolge. Zum Beispiel, wenn Ihre Datei die Zeile "Hallo Welt \ n" hat getline wird diese Zeichenfolge lesen "Hallo Welt \ 0" Also Ihr Code vermisst die "Welt".

Igonoring dieser Satz nicht definiert ist, können Sie Ihren Code ändern, wie dies funktioniert:

#include<iostream> 
#include<fstream> 
using namespace std; 

int main(int argv, char *argc) 
{ 
    ifstream fin(argc[1]); 
    char delimiter[]="|,.\n "; 
    while (getline(fin,sentence)) { 
    sentence += "\n"; 
    int pos; 
    pos = find_first_of(sentence,delimiter); 
    while (pos != string:: npos) { 
     if (pos > 0) { 
      cout << sentence.substr(0,pos) << "\n"; 
     } 
      sentence =sentence.substr(pos+1); 
      pos = find_first_of(sentence,delimiter); 
     } 
    } 
} 

Hinweis, lieh ich Bill die Lizards elegantere Lösung des letzten Trennzeichen angehängt wird. Meine vorherige Version hatte eine Loop-Exit-Bedingung.

2

this reference document Anlehnung an:

Zeichen extrahiert werden, bis die Begrenzungszeichen (\n) gefunden wird, verworfen, und die verbleibenden Zeichen zurückgegeben.

Ihre Zeichenfolge endet nicht mit einer \n, es ist ^`hello world`$, daher wird kein Trennzeichen oder neue Position gefunden.

+0

Gibt es ein anderes Trennzeichen, das in diesem Fall zum Identifizieren des Zeilenendes verwendet werden könnte? –

+0

oder könnte ich Code verwenden, um andere dann getline die \ n zu lesen? wenn es eins gibt, was ist es dann? –

+0

Ich denke, Sie haben das aus dem Artikel verpasst; 'Wenn Sie nicht möchten, dass dieser Charakter extrahiert wird, können Sie stattdessen "get" verwenden. – garrow

1

Wie andere erwähnt haben, getline gibt nicht die Newline-Zeichen am Ende. Der einfachste Weg, Ihren Code zu reparieren, besteht darin, nach dem getline-Aufruf einen an das Ende des Satzes anzuhängen.

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int main(int argv, char **argc) 
{ 
    ifstream fin(argc[1]); 
    char delimiter[] = "|,.\n "; 
    string sentence; 

    while (getline(fin,sentence)) { 
    sentence += "\n"; 
    int pos; 
    pos = sentence.find_first_of(delimiter); 
    while (pos != string::npos) { 
     if (pos > 0) { 
      cout << sentence.substr(0,pos) << endl; 
     } 
      sentence =sentence.substr(pos+1); 
      pos = sentence.find_first_of(delimiter); 
     } 
    } 
}